两个表解决方案是一个高性能且可扩展的解决方案,用于在Postgres 9.5中实现标记吗?

时间:2016-06-20 17:03:08

标签: sql database postgresql database-schema

背景

我在一家房地产技术公司工作。即将开展的项目涉及构建功能,以允许用户将标签/标签(复数)粘贴到MLS列表(房地产)。第二个要求是允许用户通过一个或多个标签进行搜索。我们不会处理跟踪计数或构建文字云或类似的东西。

研究解决方案

我找到this SO Q&A并认为解决方案非常简单,并试图从下面调整一些想法。另外,我知道JSONB支持在9.5中要好得多,可能可能。如果您有任何见解,我也很乐意在答案中听到您的想法。

尝试解决方案

:标签

:ID,OwnerID,TagName,CreatedDate

:TaggedItems

:ID,TagID(上面的引用),PropertyID,CreatedDate,(可能是一些非规范化数据,以帮助显示搜索结果;属性名称,原始列表或其他等)

插入新标签应该很简单。搜索标签也应该是直截了当的,因为用户将从可搜索的下拉列表中选择一个或多个标签,从而使我能够访问可用于查询TaggedItems表的实际TagID。当显示列表的完整配置文件视图时,我可以使用它的PropertyID和UserID来查询我的表中是否存在要在视图中显示的一个或多个标记。

编辑:值得注意的是,我们没有保留整个属性数据库,我们通过API合作伙伴访问它们;因此两个表解决方案而不是3.

1 个答案:

答案 0 :(得分:0)

如果你想要Nth标准化,你实际上会使用3个表。

1属性/列表 2个标签 3两个之间的CrossReferenceB /

第3个表在其他2个表之间创建了多对多的关系。

在这种情况下,只有第3个表可以同时携带tagid和属性。

如果很好的话,可以使用2个表,这取决于你使用的有多大的字符串,因为一个小字符串不会使你的数据库膨胀得太多。

我想说,当您需要对其进行查找时,最好将标记分隔到单独的表中。否则你必须有一个分隔列表,如果用户在其标记值中注入分隔符会发生什么?另外,您如何计划搜索分隔列表?你将不断扩展到一个表或使用正则表达式,正则表达式可能会给你误报,因为"一些"将匹配"一些"和"某事"取决于你如何编写代码.......