【发布时间】:2014-08-14 05:36:36
【问题描述】:
搜索和搜索。不知道如何使用解释/分析来回答这个问题,没有构建真正的大测试表,我没有办法或时间去追求。当然,有人可以自信地为我回答这个可能很简单的问题,并节省我数小时的测试时间。
我有一个看起来像这样的表:
id | destination_id | key | value | json_profile_data | deleted_bool | deleted_timestamp
键和值是表的原始用途,但我们最近开始存储 json 数组,现在键/值字段未使用。我想在这个记录 id 中添加 3 个新的数据位。我的直觉是在每行中为 3 个新字段创建新列,但我的同事希望使用键/值列使用相同的 destination_id 添加信息。
我的建议意味着表格中的行数更少,如下所示:
id | destination_id | key | value | json_profile_data | claim_code | claim_date | claim_approved_bool | deleted_bool | deleted_timestamp
HIS 解决方案是添加新行,使用键/值 cols 在这些新行上插入与它们的父行具有相同destination_id 的三个新信息位。
id | destination_id | null | null | json_profile_data | deleted_bool | deleted_timestamp
id | destination_id | claim_code | value | null | deleted_bool | deleted_timestamp
id | destination_id | claim_date | value | null | deleted_bool | deleted_timestamp
id | destination_id | claim_approved_bool | value | null | deleted_bool | deleted_timestamp
他的解决方案为每个destination_id 生成4 行,我的解决方案为给定的destination_id 在现有行上生成3 个新列。
针对此表进行选择时哪个性能更高?还是有关系?我希望我以一种清晰的方式写了这个。如果需要更详细的说明,请告诉我。
【问题讨论】:
-
您的解决方案更加规范化,但性能的问题对于您的特定数据和用例而言非常具体,我不知道是否在这里可以给出一个自信的答案。有时,获得更快读取或其他东西的最佳方法是对数据结构进行反规范化。
-
这是非规范化与规范化的争论...我相信您可以使用 google 找到 20 年值得阅读的主题。他的方法无法被索引...如果您使用已添加的三列中的任何一列进行搜索,则您的方法允许对它们进行索引,而他的方法则不允许。另一方面,如果这三列非常稀疏,他的方法可能会更好。这是一场漫长的辩论^^
-
与大多数事物数据库一样,答案是“取决于”,特别是需要返回什么结果集、指定了哪些谓词以及可用的索引.话虽如此,向表中添加列可能会比添加行提供更好的性能。我认为,一个更重要的问题是插入/更新/删除操作的设计。原始表看起来像是 EAV 模型的实现。为了坚持 EAV 模型,我们将添加行。如果提高性能是目标,我们将完全避免使用 EAV 模型,而只是将属性存储为列。
-
感谢您的意见。既然你们都评论了我不能投票或选择这些答案中的任何一个,但我学到了我需要知道的东西,在我们的案例中,能够索引是我决定的关键,并且“我赢得了办公室辩论“, 或多或少。 ;) 谢谢大家!
-
这样的问题必须提供正确的表定义,显示数据类型(
\dt tblin psql)。并且总是你的 Postgres 版本,即使我们在这里可能不依赖它。
标签: sql postgresql database-design entity-attribute-value