打算用 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 值,然后做判断?
1
7654 2018-09-20 19:00:51 +08:00
另外建一个 nickname 表,交给有需求的人维护
+------+-----------+- | id |nickname1| +------+-----------+-- | 3 | 越王头 | +------+-----------+ | 3 | 奶桃 | +------+-----------+ |
2
zhyu 2018-09-20 19:06:29 +08:00
另外给别名建个表,而且把本名也当作一个别名,这样查询的时候就不用考虑使用的是本名还是别名了
+------+-------+------+ | id | count |amout | +------+-----------+-------+------+ | 3 | 666 | 22 | +------+-------+------+ +------+-----------+ | item_id | item_name | +------+-----------+ | 3 | 椰子 | +------+-----------+ | 3 | 越王头 | +------+-----------+ | 3 | 奶桃 | +------+-----------+ |
3
littlewing 2018-09-20 19:09:19 +08:00
不要用 mysql,用 mongodb
|
4
tomczhen 2018-09-20 19:10:19 +08:00 via Android
MySQL 也支持 JSON 类型了
|
5
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. 不好查询, 这两种方式写查询都会很别扭, 特别是第二种会有性能问题. 所以还是单独建立一个昵称表, 然后关联 |
6
luguhu 2018-09-20 19:30:40 +08:00 via Android
用个 JSON 字段,没有就 JSON 格式的字符串
|
7
Leigg 2018-09-20 19:38:16 +08:00 via iPhone
mysql 用 1 楼的做法,另建个表存别名,查的时候用联查,用 mongo 一个表完事,把别名字段作数组存。
|
8
realpg 2018-09-20 20:03:56 +08:00
tbl_item:
id,name tbl_nickname: id,item_id,nickname |
9
realpg 2018-09-20 20:05:45 +08:00
具体查询根据你的需要构造 join 或者程序逻辑处理 都可以很简单处理
|
10
ibufu 2018-09-20 23:00:17 +08:00
不建议存 JSON
|
11
PythonAnswer 2018-09-20 23:13:26 +08:00 via iPhone
主表放 id
名称表放所有别名 唯一名称也可以放主表。唯一名称建议放拉丁学名。 你这生物表里怎么乱入个肖申克? |
12
luozic 2018-09-21 08:49:39 +08:00
这种塞 elk 或者 redis 里面不是更合适?
|
13
annielong 2018-09-21 09:48:56 +08:00
没用过其它数据库,基本上 sql,mysql 遇到此类问题都是建立别名表,再建一个关联表,
|
14
saulshao 2018-09-21 10:18:40 +08:00
这个关系数据库的标准做法就是建立一个别名表,然后关联到 ID 上。这么做有很强的扩展能力
|
15
GoLand 2018-09-21 13:13:52 +08:00 via iPhone
如果是搜索,这不应该是搜索引擎该做的事吗,维护同义词文件。
|
16
pppguest3962 OP 晚了感谢各位,思路豁然开朗。。。
确定把所有对象设立一个唯一 ID (不是自增长的序列 ID 号),再建立一张别名表,以相同 ID 作为关系。 需要的时候,同时查两张表。。。 @PythonAnswer,有别名的名词例子而已,植物和草药有别名,电影名字也有别名,银幕演员都有别名啊,只是例子而已。。。。 |