我从事关系数据库编程多年,但现在遇到了一个不寻常且棘手的问题:
我正在构建一个需要非常快速且易于定义的实体(由用户)的应用程序。然后可以创建、更新、删除这些实体的实例等。
我能想到的有两种选择。
选项 1 - 动态创建的表
第一种选择是编写一个引擎来动态生成表,并将数据插入到这些表中。但是,这将变得非常棘手,因为每个查询也需要是动态的,或者至少是动态创建的存储过程等。
选项 2 - 实体 - 键 - 值模式
这是我能想到的唯一现实的选择,我有 5 个表结构:
实体类型
EntityTypeID 整数
实体类型名称 nvarchar(50)
实体
实体ID int
EntityTypeID 整数
字段类型
字段类型ID int
字段类型名称 nvarchar(50)
SQLtype int
字段值
实体ID int
字段 ID 整数
值 nvarchar(MAX)
字段
字段 ID 整数
字段名称 nvarchar(50)
字段类型ID int
“FieldValues”表的工作方式有点像数据仓库事实表,我所有的插入/更新都可以通过填充“Key/Value”表值参数并将其传递给 SPROC(以避免多次插入/更新)来工作。
所有的表都会被大量索引,我最终会做很多自连接来获取数据。
我已经阅读了很多关于键/值数据库有多糟糕的信息,但对于这个问题,它似乎仍然是最好的。
现在我的问题!
- 除了这两个选项之外,任何人都可以提出另一种方法或模式吗?
- 选项二对于中型数据集(最多 100 万行)是否可行?
- 我可以使用的选项 2 是否有进一步的优化?
非常感谢任何方向和建议!