我正在尝试确定存储具有非常相似属性的实体的最佳方法。主要区别在于每个实体都引用其他实体。我打算将数据库设置为:
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并希望使用它的缓存功能来尽可能多地加载数据库,但这将受到限制,因为一些数据会从第二个变为第二个。
非常感谢任何帮助。
答案 0 :(得分:1)
我认为很难预测一个与另一个的实际表现,因为它依赖于很多东西。
有几个注意事项:
实体之间的区别有多重要?如果您发现自己经常每个查询只选择一种类型的实体,那么标准化解决方案可能会更快。
如果您的查询选择了除共享列之外的其他内容,例如:entity_a with entity_c IN(something)
,您将需要entity_c列的索引。
entity_c非常大。如果它得到了很多更新,并且很少被查询,那么如果您要使用非规范化版本,则会引起关注。
如果你做了很多JOIN,我很确定规范化形式更快。</ p>
我的建议是:使用标准化表格。如果您发现性能问题,可以查看此解决方案。
你也可以选择混合解决方案。由于b和c经常变化,而其他人则不变:制作两个这样的表。或者给b和c它自己的表,但保持其他一个。