我正在设计一个类似联系人管理器/地址簿的应用程序,但不能满足于数据库设计。
在我目前的设置中,我有一个联系人,其中包含地址,电话号码,电子邮件和组织。所有联系人属性当前都是单独的表,其中fk到Contact表。不用说,联系人可以拥有任何数量的这些属性。
现在,如果我想在应用程序中阅读联系人,我发现自己将所有这些表连接在一起。由于没有对相关表执行过滤,反向查找,排序等,将相关字段作为json编码列表存储在Contact表的直接属性上不是更好/更简单的解决方案吗?
例如,不是将fk连接到带有3个条目的phonenumber表,只需编码所有的phonenumber并将它们存储到Contact表的字段中?
任何见解都非常感谢! (我正在使用Django虽然这并不重要)
答案 0 :(得分:6)
您能保证您的应用永远不会成长为需要其他功能吗?你真的想把自己画到角落里,这样你以后就不能轻易支持所有这些了吗?
通常,非规范化仅出于性能原因而发生。然后,仍然保留标准化数据的副本用于实时工作,并且非规范化数据用于离线处理,其中静态快照很好。
习惯编写联接。这就是SQL的工作方式。必须这样做并不意味着出了问题。
答案 1 :(得分:0)
我知道我已经太晚了,但对于那些有同样问题的人来说。
IMO,在这种情况下,元数据建模是可行的方法。 http://searchdatamanagement.techtarget.com/feature/Data-model-patterns-A-metadata-map
答案 2 :(得分:0)
听起来你建议将当前建模为五个SQL表的数据转换为一个常见的多值类型(你的SQL产品是否对此有很好的支持?)我能看到的唯一方法就是构成'非规范化'会如果您提议违反1NF,那么您可以放弃SQL作为数据存储,因为您的数据将不再是关系数据!否则,您的数据仍将被标准化,但您将无法使用SQL查询其属性(除非您的SQL产品具有用于查询多值属性的扩展)。决定因素似乎是:您是否需要使用SQL查询这些属性?