【发布时间】:2011-07-03 15:25:16
【问题描述】:
我的要求是:
- 需要能够动态添加任何数据类型的用户定义字段
- 需要能够快速查询 UDF
- 需要能够基于数据类型对 UDF 进行计算
- 需要能够根据数据类型对 UDF 进行排序
其他信息:
- 我主要在寻找性能
- 有几百万条主记录可以附加 UDF 数据
- 上次检查时,我们当前的数据库中有超过 5000 万条 UDF 记录
- 大多数情况下,UDF 仅附加到几千条主记录,而不是全部记录
- UDF 未连接或用作键。它们只是用于查询或报告的数据
选项:
用 StringValue1、StringValue2...IntValue1、IntValue2...等创建一个大表。我讨厌这个想法,但如果有人能告诉我它比其他想法更好以及为什么会考虑它。
创建一个动态表,根据需要添加一个新列。我也不喜欢这个想法,因为我觉得性能会很慢,除非你为每一列都建立索引。
创建一个包含 UDFName、UDFDataType 和 Value 的表。添加新的 UDF 时,生成一个视图,该视图仅提取该数据并将其解析为指定的任何类型。不符合解析条件的项返回 NULL。
创建多个 UDF 表,每种数据类型一个。所以我们会有用于 UDFStrings、UDFDates 等的表。可能会做与 #2 相同的操作,并在添加新字段时自动生成视图
XML 数据类型?我以前没有使用过这些,但已经看到它们被提及。不确定他们是否会给我想要的结果,尤其是在性能方面。
还有别的吗?
【问题讨论】:
-
Martin Fowler 推荐 2(用户可更新架构)或 5(索引 XML LOB):martinfowler.com/bliki/UserDefinedField.html
-
另请参阅 dynamic database schemas 上的 StackOverflow 问题。
-
现在很多数据库都支持 JSON 字段...但是索引/性能仍然是个问题。例如 PostgreSQL (v13) 支持 GIN indexes on JSON... 但是只支持相等运算符(不支持范围查询)。 MongoDB 似乎对wildcard indexes 有更好的支持。
标签: sql database database-design user-defined-fields