V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pppguest3962
V2EX  ›  Python

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

  •  
  •   pppguest3962 · 2018-09-20 18:55:53 +08:00 · 2868 次点击
    这是一个创建于 2260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    打算用 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 值,然后做判断?
    
    16 条回复    2018-09-21 23:37:24 +08:00
    7654
        1
    7654  
       2018-09-20 19:00:51 +08:00
    另外建一个 nickname 表,交给有需求的人维护
    +------+-----------+-
    | id |nickname1|
    +------+-----------+--
    | 3 | 越王头 |
    +------+-----------+
    | 3 | 奶桃 |
    +------+-----------+
    zhyu
        2
    zhyu  
       2018-09-20 19:06:29 +08:00
    另外给别名建个表,而且把本名也当作一个别名,这样查询的时候就不用考虑使用的是本名还是别名了

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

    +------+-----------+
    | item_id | item_name |
    +------+-----------+
    | 3 | 椰子 |
    +------+-----------+
    | 3 | 越王头 |
    +------+-----------+
    | 3 | 奶桃 |
    +------+-----------+
    littlewing
        3
    littlewing  
       2018-09-20 19:09:19 +08:00
    不要用 mysql,用 mongodb
    tomczhen
        4
    tomczhen  
       2018-09-20 19:10:19 +08:00 via Android
    MySQL 也支持 JSON 类型了
    lihongjie0209
        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. 不好查询, 这两种方式写查询都会很别扭, 特别是第二种会有性能问题.



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

    id,name

    tbl_nickname:

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

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

    你这生物表里怎么乱入个肖申克?
    luozic
        12
    luozic  
       2018-09-21 08:49:39 +08:00
    这种塞 elk 或者 redis 里面不是更合适?
    annielong
        13
    annielong  
       2018-09-21 09:48:56 +08:00
    没用过其它数据库,基本上 sql,mysql 遇到此类问题都是建立别名表,再建一个关联表,
    saulshao
        14
    saulshao  
       2018-09-21 10:18:40 +08:00
    这个关系数据库的标准做法就是建立一个别名表,然后关联到 ID 上。这么做有很强的扩展能力
    GoLand
        15
    GoLand  
       2018-09-21 13:13:52 +08:00 via iPhone
    如果是搜索,这不应该是搜索引擎该做的事吗,维护同义词文件。
    pppguest3962
        16
    pppguest3962  
    OP
       2018-09-21 23:37:24 +08:00
    晚了感谢各位,思路豁然开朗。。。
    确定把所有对象设立一个唯一 ID (不是自增长的序列 ID 号),再建立一张别名表,以相同 ID 作为关系。
    需要的时候,同时查两张表。。。
    @PythonAnswer,有别名的名词例子而已,植物和草药有别名,电影名字也有别名,银幕演员都有别名啊,只是例子而已。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.