通讯录数据库设计:去规范化?

6
我正在设计一个类似于联系人管理/地址簿的应用程序,但无法确定数据库设计。
在我的当前设置中,我有一个联系人(Contact),它有地址(Addresses)、电话号码(Phonenumbers)、电子邮件(Emails)和组织(Organizations)。所有联系人属性都是当前单独的表格,并且具有指向联系人表格的外键。不用说,一个联系人可以拥有任意数量的这些属性。
现在,如果我想将联系人读入应用程序,则需要将所有这些表格连接在一起。由于相关表格上没有执行筛选、反向查找、排序等操作,所以是否将相关字段存储为直接属性的json编码列表更好/更简单呢?
例如,而不是具有指向具有3个条目的电话号码表的联系人(Contact),只需对所有电话号码进行编码并将其存储到联系人表的字段中即可?
非常感谢您的任何见解!(FYI我正在使用Django,虽然这并不重要)
3个回答

7
你能保证你的应用程序永远不需要这些其他功能吗?你真的想把自己困在一个角落里,以至于以后无法轻松支持所有这些功能吗?
通常情况下,反规范化仅出于性能原因。然后,规范化数据的副本仍然保留用于实时工作,而反规范化数据用于离线处理,其中具有静态快照是可以的。
习惯写连接查询。这就是SQL的工作方式。必须这样做并不意味着有什么问题。

0

0

听起来你提议将目前被建模为五个 SQL 表格的数据转换成一个通用的多值类型(你的 SQL 产品对此有很好的支持吗?)。我唯一能看到这会构成“去规范化”的方式是,如果你打算违反 第一范式,那么你可能要放弃将 SQL 作为数据存储,因为你的数据将不再是关系型的!否则,你的数据仍然是规范化的,但你将失去使用 SQL 查询其属性的能力(除非你的 SQL 产品具有查询多值属性的扩展功能)。决定因素似乎是:你是否需要使用 SQL 查询这些属性?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接