将所有联系信息放在一个表中与使用键值表
Posted
技术标签:
【中文标题】将所有联系信息放在一个表中与使用键值表【英文标题】:Having all contact information in one table vs. using key-value tables 【发布时间】:2015-05-21 15:58:25 【问题描述】:(注意。这个问题与this 不重复,因为我正在处理一个 ORM 系统)
我的数据库中有一个表来存储所有Contacts
信息。每个联系人的某些列是固定的(例如 Id、InsertDate 和 UpdateDate)。在我的程序中,我想为用户提供为每个联系人添加或删除属性的选项。
现在这里当然有两种选择:
-
首先是将其全部保存在一个表中,并在用户需要时添加和删除整个列;
创建一个键值表以将每个属性与其类型一起保存,并将记录连接到用户的 ID。
这些选择都是可行的。但是我想知道哪个在速度方面更好?在程序中,用户查看整个Contact
列表以检查更新将是很常见的事情。另外,我正在使用 ORM 框架(微软的实体框架)来处理数据库查询。因此,如果用户要一直在表中添加和删除列,那么将它们映射到我的程序将是一项艰巨的任务。但同样,如果备选方案 (1) 比 (2) 好得多,那么我可以重新考虑键值选项。
【问题讨论】:
【参考方案1】:这两件事我都做过。
示例 #1
大而宽的表格,其中包含姓名、电话、地址和许多跟踪客户详细信息的小整数值的数据列。
示例 #2
许多不同的表将所有字符变化数据字段、小整数值等分开。
示例 #1 的编码速度要快得多,但就性能而言,一旦表格填满记录,它就会变得非常慢。 5000不是问题。当它达到 50,000 时,性能明显下降。
示例 #2 是在我后来的编码经验中构建的,旨在解决示例 #1 中发现的问题。虽然获得我所追求的记录需要更多时间(LEFT JOIN this and UNION that),但速度要快得多,因为您最终可以准确地选择客户所追求的内容,而无需搜索一个充满数据的大型宽表都在请求中。
我会推荐示例 #2 以适合您的问题中的 #2。
您的 USER 为他们的数据集指定的列可以存储在他们自己的表中(取决于我想有多少),这将允许您在特定于该 USER 的表上绘制,这也将给出您可以无限地删除和添加列以适应特定设置。
然后,您还可以使用另一个表来跟踪自定义列表中的自定义列,这将使您能够在以后“恢复”列,例如“是否要将其添加到当前列选择中或您过去删除的这些列之一”。
【讨论】:
以上是关于将所有联系信息放在一个表中与使用键值表的主要内容,如果未能解决你的问题,请参考以下文章
ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值