我从事关系数据库编程多年,但现在遇到了一个不寻常且棘手的问题:
我正在构建一个需要具有非常快速且易于定义的实体(由用户)的应用程序。然后可以创建、更新、删除这些实体的实例等。
我能想到两种选择。
选项 1 - 动态创建表
第一个选项是编写一个引擎来动态生成表格,并将数据插入其中。然而,这将变得非常棘手,因为每个查询也需要是动态的,或者至少是动态创建的存储过程等。
选项 2 - 实体 - 键 - 值模式
这是我能想到的唯一现实的选择,我有 5 个表结构:
实体类型
实体类型 ID 整型
实体类型名称 nvarchar(50)
实体
实体ID整型
实体类型 ID 整型
字段类型
字段类型ID 整型
字段类型名称 nvarchar(50)
SQL 类型 int
字段值
实体ID整型
字段ID整型
值 nvarchar(MAX)
字段
字段ID整型
字段名 nvarchar(50)
字段类型ID 整型
“FieldValues”表的工作方式有点像数据仓库事实表,我所有的插入/更新都将通过填充“Key/Value”表值参数并将其传递给 SPROC(以避免多次插入/更新)来工作).
所有的表都会被大量索引,我最终会做很多自连接来获取数据。
我已经阅读了很多关于 Key/Value 数据库有多糟糕的文章,但是对于这个问题它似乎仍然是最好的。
现在我的问题!
- 除了这两个选项之外,还有谁能建议另一种方法或模式吗?
- 选项二对于中型数据集(最多 100 万行)是否可行?
- 我可以使用选项 2 是否有进一步的优化?
非常感谢任何指导和建议!
最佳答案
我个人只会使用“noSQL”(键/值)数据库,如 MongoDB .
但是如果您需要使用关系数据库,则选项 2 是可行的方法。这种模型的一个很好的例子是 Alfresco Data Dictionary (Alfresco 是一个企业内容管理系统)。它的设计类似于您所描述的,尽管它们有多个字段值列(对于数据库中可用的每个简单类型)。如果您向其中添加一个好的缓存系统(例如 Ehcache),它应该可以正常工作。
关于sql - 动态数据库/键 - 值/实体 - 键值困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609592/