1M行,1个表,几列与300个表,3000行,少列与300列,3000行,1个表?

时间:2016-01-19 08:19:14

标签: mysql database database-design database-schema

我一直在寻找解决此问题的最佳方法,但我找不到任何此类问题的例子。

我正在建立一个超本地化的互联网购物中心,该区域分为约3000个区域。每个区域包含约300个项目。它们是类似的项目,但每个区域可以变化很小。我需要获取"可用项目列表"对于每个区域。

插入速度不是问题,主要是根据"区域"值。为这样的实例设置数据库的最有效方法是什么?

  1. 包含1M行的表格,例如

    id |区域|项目|果
    1 | 1 | 1 | ÿ
    2 | 1 | 2 | ñ
    ...
    1262 | 4 | 35 | ÿ

  2. 包含3000行的300个表,例如

    表:zone1
    id |项目|果
    1 | 1 | ÿ
    2 | 2 | Ñ

    表:zone4
    id |项目|果
    ...
    35 | 35 | ÿ

  3. 包含300列(每个项目),3000行

    的1个表

    id |区域| item1 | item2 ...
    1 | 1 | Y | N ...
    ...
    4 | 4 | Y |是的......

  4. 提前感谢任何帮助或我可以使用的任何线索,以便我做出决定!

4 个答案:

答案 0 :(得分:2)

基于意见的限制,但我们走了;

  • 选项1很可能是您想要的。

  • 选项2会为你提供300个表来维护,所以如果你需要在以后添加一个字段,你就有300个表可以改变哪些听起来像是一个可维护性的噩梦。此外,300个索引最有可能缓存比单个更大的索引更糟糕,并且在所有区域中搜索特定项目基本上是不可能的。

  • 选项3要求您更改表结构和查询以添加超过300个项目。另外,为了能够通过id找到一个项目,你需要看起来像SELECT xx FROM yy WHERE item1=57 OR item2=57 OR ... OR item300=57的SQL,MySQL的优化器很可能会放弃它。

答案 1 :(得分:1)

对于关系数据库的观点,您应该选择第一个选项。   - 如果有一天您必须添加新项目或新区域,则无需创建新列或新表,如果需要删除项目/区域,则无需创建新项目或新区域。

但是从NoSQL的角度来看,你应该选择像选项2这样的表。

答案 2 :(得分:0)

只需使用第一个选项。 1M行,1个表,几列。

答案 3 :(得分:0)

第一个选项是最好的选择。 DBMS会在每个表和每行产生很大的开销。此外,它们不是针对许多表格和多行的情况而设计的。