(注意。问题不是 this 的重复问题,因为我正在处理 ORM 系统)
我的数据库中有一个表来存储所有联系人
信息。每个联系人的某些列是固定的(例如 Id、InsertDate 和 UpdateDate)。在我的程序中,我想为用户提供为每个联系人添加或删除属性的选项。
现在这里当然有两种选择:
- 首先是将其全部保存在一个表中,并在用户需要时添加和删除整个列;
- 创建一个键值表以保存每个属性及其类型并将记录连接到用户的 ID。
这些替代方案都是可行的。但我想知道哪个在速度方面更好?在程序中,用户查看整个 Contact
列表以检查更新将是一件很常见的事情。另外,我正在使用 ORM 框架(Microsoft 的 Entity Framework )来处理数据库查询。因此,如果用户要一直在表中添加和删除列,将它们映射到我的程序将是一项艰巨的任务。但同样,如果备选方案 (1) 比 (2) 明显更好,那么我可以重新考虑键值选项。
最佳答案
这两个我其实都做过。
示例#1
大而宽的表格,包含包含姓名、电话、地址和许多跟踪客户详细信息的小整数值的数据列。
示例 #2
许多不同的表格将所有字符变化数据字段、小整数值等分开
示例 #1 的编码速度要快得多,但就性能而言,一旦表格充满记录,它就会变得非常慢。 5000不是问题。当它达到 50,000 时,性能明显下降。
示例 #2 是我后来根据编码经验构建的,旨在解决示例 #1 中发现的问题。虽然获得我想要的记录需要更多时间(LEFT JOIN this 和 UNION that),但速度要快得多,因为您最终可以准确地挑选和选择客户想要的内容,而不必搜索一个充满数据的大型宽表,而这些数据不是全部被请求。
我会推荐示例 #2 以适合问题中的 #2。
并且您的用户为他们的数据集指定的列可以存储在他们自己的表中(取决于我想有多少)这将允许您在特定于该用户的表上进行绘制,这也将提供您可以无限地删除和添加列以适合特定设置。
然后您还可以有另一个表来跟踪自定义列表中的自定义列,这将使您能够稍后“恢复”列,如“您要将此添加到当前列选择中吗或您过去删除的这些列之一”。
关于sql - 将所有联系信息放在一张表中与使用键值表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378812/