MySql最佳实践:单字段,多字段或第二表中的列表/数组

Exi*_*xit 2 mysql database database-design

好的,我将要处理大约1,000,000件商品,这些商品将由数量有限的商店共享.商店数量限制在5个左右,但这可能会发生变化.产品表已经有大约60到70个字段需要管理.

这是我正在考虑的三种方法:

  1. 将值内嵌到一个小的varchar中,比如大约20个字符长,分隔符可以存储大约10个商店来关联产品.MySQL select可以使用LIKE'%| 2 |%'来匹配商店ID为2的任何产品.

    关于使用MySQL程序的讨论也很多.

    优点:一个领域,容易容纳更多商店,使用更少的内存?

    缺点:文本搜索,需要更长时间?

  2. 为每个创建一个TINYINT(1)和一个新字段是最简单的也可能是最好的.问题是,如果添加新商店,则必须添加新字段,从而改变数百万种产品.

    优点:易于选择

    缺点:添加商店需要改变表格结构,需要管理更多字段 - 如果他们有20个商店需要管理(面向未来)

  3. 我期望的标准响应是使用链接表将产品与商店关联,只是两个字段表.我担心的是,如果大多数商店都使用大多数产品,那么突然之间,该表中可能会有大约500万行.

    我可以打破链接表以减少行数,例如通过产品名称的第一个字母,并有26个链接表.

    优点:LEFT JOIN易于使用

    缺点:除非爆发,否则几乎每个查询都需要搜索500万个链接表

我真的应该在一起进行一些测试,以找出最佳的响应/处理时间,但这需要一些时间.我很想知道什么是最好的解决方案,可以保证数据的存储能够满足更多商店的需求,并有效地存储.

mu *_*ort 6

您在赞成和反对清单中遗漏了一个非常重要的考虑因素:参照完整性.如果一个快速的数据库可以让你轻松查询,如果它充满了破碎的数据,只会让你更快地犯错误,犯错误是人类需要帮助的最后一件事.允许外键(即引用完整性)的唯一选项是选项(3).

链接表也是处理此类事物的标准方法,数据库通常用于处理标准用例.

就(1)而言,做a LIKE '%x%'几乎每次都会进行表扫描,而表扫描是你想要的最后一件事.您还必须确保|在字符串的开头和结尾处有分隔符,否则您将需要三个LIKE(或正则表达式)而不是一个.某些数据库可以使用索引LIKE 'x%'但不适用于您的情况.

方法(2)使用了太多列,你的查询将是一团糟,你的表将太宽.您还必须担心确保一个表中的每一行在另一个表中都有相应的列.