MySQL 的表,一个物品如果有多个不确定的别名,设计在表里,还是设计在 Python 程序的算法里比较好?

2018-09-20 18:55:53 +08:00
 pppguest3962

打算用 MySQL 拿来存储很多“对象”, 方便在 python 里去“翻阅”这些对象。。。 建了一个表, “对象”也许会有很多别名,也许根本没有别名。。。

有以下物品:

椰子:越王头、奶桃
石蒜:彼岸花、曼珠沙华
珐琅:搪瓷
樱桃:车厘子
草莓,士多啤梨
土豆:马铃薯
桂圆:龙眼
肖申克的救赎:刺激 1995、月黑风高
白及:白鸡儿、地螺丝、连及萆
白花蛇:银环蛇
白头翁:白头公
白术:烘术、冬术、生晒术、于术
白芷:香萆
百部:百奶根、野天门冬、婆妇萆、虱药
斑蝥:斑毛、斑猫、班蚝
板蓝根:大青口十
半边莲:佛甲萆、半边花、莲花草
半枝莲:并头萆、韩信萆、半向花、半面花
毕澄茄:山鸡椒、山苍子、木姜子
鳖甲:上甲、团甲鱼、鳖盖
槟榔:玉片、大腹子、海南子、大片白
冰片:龙脑、片脑、梅片
一个 col 大概是这样的:
(ID,名称,数量,时间,等等等等。。。。)
以椰子为例:

mysql> select * from testitems;
+------+-----------+-------+------+---------+
|  id  | item_name | count |amout |nickname1|
+------+-----------+-------+------+---------+
|    3 | 椰子      | 666   | 22   |越王头   |
+------+-----------+-------+------+---------+
x rows in set (0.02 sec)


如果查找“越王头”,那么等同找出“椰子”

是在 col 里添加别名继续延展储存别名?  
有其他技术,另外建个别名表,使别名表跟 testitems 表产生关联?

还是在程序里设计把检索出来的整行,全部滤出 nicname*名称的 value 值,然后做判断?
2886 次点击
所在节点    Python
16 条回复
7654
2018-09-20 19:00:51 +08:00
另外建一个 nickname 表,交给有需求的人维护
+------+-----------+-
| id |nickname1|
+------+-----------+--
| 3 | 越王头 |
+------+-----------+
| 3 | 奶桃 |
+------+-----------+
zhyu
2018-09-20 19:06:29 +08:00
另外给别名建个表,而且把本名也当作一个别名,这样查询的时候就不用考虑使用的是本名还是别名了

+------+-------+------+
| id | count |amout |
+------+-----------+-------+------+
| 3 | 666 | 22 |
+------+-------+------+

+------+-----------+
| item_id | item_name |
+------+-----------+
| 3 | 椰子 |
+------+-----------+
| 3 | 越王头 |
+------+-----------+
| 3 | 奶桃 |
+------+-----------+
littlewing
2018-09-20 19:09:19 +08:00
不要用 mysql,用 mongodb
tomczhen
2018-09-20 19:10:19 +08:00
MySQL 也支持 JSON 类型了
lihongjie0209
2018-09-20 19:30:15 +08:00
+------+-----------+-------+------+---------+
| id | item_name | count |amout |nickname1|
+------+-----------+-------+------+---------+
| 3 | 椰子 | 666 | 22 |越王头 |
+------+-----------+-------+------+---------+


+------+-----------+-------+------+---------+
| id | item_name | count |amout |nickname|
+------+-----------+-------+------+---------+
| 3 | 椰子 | 666 | 22 |越王头 , 其他别名 |
+------+-----------+-------+------+---------+

上述这两种方法都违反了数据库设计的第一范式, 要确保每一列都不可再分.


这么设计的可以想到的坏处
1. 单独对于别名的创建 ,更新, 删除是不可能的, 但是也需要看你们业务需求, 如果没有这种需求, 那么这条可以忽略.
2. 扩展性不好, 第一中方式如果需要添加一个新的别名需要更新表结构
3. 不好查询, 这两种方式写查询都会很别扭, 特别是第二种会有性能问题.



所以还是单独建立一个昵称表, 然后关联
luguhu
2018-09-20 19:30:40 +08:00
用个 JSON 字段,没有就 JSON 格式的字符串
Leigg
2018-09-20 19:38:16 +08:00
mysql 用 1 楼的做法,另建个表存别名,查的时候用联查,用 mongo 一个表完事,把别名字段作数组存。
realpg
2018-09-20 20:03:56 +08:00
tbl_item:

id,name

tbl_nickname:

id,item_id,nickname
realpg
2018-09-20 20:05:45 +08:00
具体查询根据你的需要构造 join 或者程序逻辑处理 都可以很简单处理
ibufu
2018-09-20 23:00:17 +08:00
不建议存 JSON
PythonAnswer
2018-09-20 23:13:26 +08:00
主表放 id
名称表放所有别名

唯一名称也可以放主表。唯一名称建议放拉丁学名。

你这生物表里怎么乱入个肖申克?
luozic
2018-09-21 08:49:39 +08:00
这种塞 elk 或者 redis 里面不是更合适?
annielong
2018-09-21 09:48:56 +08:00
没用过其它数据库,基本上 sql,mysql 遇到此类问题都是建立别名表,再建一个关联表,
saulshao
2018-09-21 10:18:40 +08:00
这个关系数据库的标准做法就是建立一个别名表,然后关联到 ID 上。这么做有很强的扩展能力
GoLand
2018-09-21 13:13:52 +08:00
如果是搜索,这不应该是搜索引擎该做的事吗,维护同义词文件。
pppguest3962
2018-09-21 23:37:24 +08:00
晚了感谢各位,思路豁然开朗。。。
确定把所有对象设立一个唯一 ID (不是自增长的序列 ID 号),再建立一张别名表,以相同 ID 作为关系。
需要的时候,同时查两张表。。。
@PythonAnswer,有别名的名词例子而已,植物和草药有别名,电影名字也有别名,银幕演员都有别名啊,只是例子而已。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/491288

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX