Database design 在RDBMS中将一组键值对存储为不透明字符串/Blob时,如何避免重复?

Database design 在RDBMS中将一组键值对存储为不透明字符串/Blob时,如何避免重复?,database-design,data-structures,dictionary,Database Design,Data Structures,Dictionary,我试图决定如何在数据库中存储一组键值对(字符串)。使用两个表时,经典方法类似于此: +-------------+ | PropertySet | +-------------+ | set_id | | property_id | | value | +-------------+ +-------------+ | Property | +-------------+ | property_id | | name

我试图决定如何在数据库中存储一组键值对(字符串)。使用两个表时,经典方法类似于此:

+-------------+ | PropertySet | +-------------+ | set_id | | property_id | | value | +-------------+ +-------------+ | Property | +-------------+ | property_id | | name | +-------------+ +-------------+ |财产集| +-------------+ |集合id| |物业编号| |价值观| +-------------+ +-------------+ |财产| +-------------+ |物业编号| |名字| +-------------+ 现在,就我而言,这似乎有点过分了。我几乎不打算使用SQL来处理这些数据,我希望避免在这个设计中需要更复杂的查询。我可能更喜欢用id存储JSON或protobuf blob,如下所示:

+-------------+ | PropertySet | +-------------+ | set_id | | data | +-------------+ +-------------+ |财产集| +-------------+ |集合id| |资料| +-------------+ 但是,我想确保没有重复的。我可以想象按键名对集合排序,规范化格式,然后进行字符串比较。还有其他选择吗


我也很欣赏关于实际设计问题的建议(关系数据库与BLOB),但也许这应该成为评论。

我以前考虑过这个问题,但从未尝试过实现解决方案,所以对我的建议持保留态度


如果为数据生成一个散列,那么可以将该散列存储在表中的唯一索引中。

以下是对此的一些想法:

  • Blob列的速度往往较慢,因为Blob与大多数数据库中的表数据分开存储

  • 如果希望数据库确保唯一性,则需要property键来构成properties表的数据库键的一部分,因此需要类似于post中描述的property/PropertySet表的结构来从数据库中获取完整性约束

  • 在任何不重要的情况下,您可能不是唯一一个查询数据库的人。在不透明结构中编码数据会使第三方更难使用数据

  • 属性集/属性表的查询效率相当高,特别是在支持聚集索引的平台上

如果您想获得数据库系统的完整性,就必须遵守其规则。唯一的其他选择是在数据库的上游以编程方式强制执行它


通过编程方式分离属性集并对其进行排序以发现重复项似乎至少与查询连接的属性集/属性结构一样复杂,因此我怀疑通过展平它是否真的节省了自己的精力。无论哪种情况,您都需要将其转换为具有键/值对的结构-这样加载和存储它们可能更容易,而且第三方将更容易访问数据库。

我不关心第三方,但您的观点是好的。是的,可能有重复的,但是,如果您使用散列值来限制潜在的重复项,那么您只需要比较具有相同散列值的实际值