将所有联系信息放在一个表中与使用键值表

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 索引表键值

无法读取表键但在颤动中获取实时数据库中的键值

如何将postgres jsonb字段的属性插入键值表?

Postgresql:如何在不使用中间 hstore 的情况下将键值表转换为 json

键值表

如何使用behave context.table与键值表?