数据库架构 - 创建一个或多个大表?

时间:2013-08-23 08:50:18

标签: php mysql codeigniter database-design database-schema

我正在尝试确定存储具有非常相似属性的实体的最佳方法。主要区别在于每个实体都引用其他实体。我打算将数据库设置为:

entity_a (1-1,000 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name|entity_b_id|entity_c_id|entity_d_id

entity_b (10,000-1,000,000 Records) [Data changes constantly]
id|created|updated|entity_b_id|category_id|name|entity_c_id|entity_e_id|entity_f_id

entity_c (10,000-10,000,000 Records) [Data changes constantly]
id|created|updated|entity_b_id|category_id|name|entity_a_id|entity_f_id

entity_d (0-1,000 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name

entity_e (1-100 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name|entity_a_id|entity_b_id

entity_f (0-50,000 Records) [Data frequently changes]
id|created|updated|entity_b_id|category_id|name|entity_c

entity_g (10-100 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name

entity_h (10-1,000 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name|entity_e_id

entity_i (1-10 Records) [Data rarely changes]
id|created|updated|entity_b_id|category_id|name

但有人建议管理一个大表会更容易:

ent (20,000-11,000,000 Records)
id|created|updated|ent_id(b)|category_id|name|ent_id(a)|ent_id(b)|ent_id(c)|ent_id(d)|ent_id(e)|ent_id(f)

关于第二种方法的一个问题是表的大小,因为id将是int(11),并且这些id的六列将主要设置为0。

但我主要担心的是访问速度,因为许多用户会立即非常频繁地访问记录。我正在使用CodeIgniter并希望使用它的缓存功能来尽可能多地加载数据库,但这将受到限制,因为一些数据会从第二个变为第二个。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为很难预测一个与另一个的实际表现,因为它依赖于很多东西。

有几个注意事项:

实体之间的区别有多重要?如果您发现自己经常每个查询只选择一种类型的实体,那么标准化解决方案可能会更快。

如果您的查询选择了除共享列之外的其他内容,例如:entity_a with entity_c IN(something),您将需要entity_c列的索引。

entity_c非常大。如果它得到了很多更新,并且很少被查询,那么如果您要使用非规范化版本,则会引起关注。

如果你做了很多JOIN,我很确定规范化形式更快。<​​/ p>

我的建议是:使用标准化表格。如果您发现性能问题,可以查看此解决方案。

你也可以选择混合解决方案。由于b和c经常变化,而其他人则不变:制作两个这样的表。或者给b和c它自己的表,但保持其他一个。