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