【发布时间】:2012-01-26 10:22:07
【问题描述】:
我从事关系数据库编程多年,但现在遇到了一个不寻常且棘手的问题:
我正在构建一个应用程序,该应用程序需要具有非常快速且易于定义的实体(由用户)。然后可以创建、更新、删除这些实体的实例等。
我能想到两种选择。
选项 1 - 动态创建的表
第一个选项是编写一个引擎来动态生成表,并将数据插入到这些表中。但是,这会变得非常棘手,因为每个查询也需要是动态的,或者至少是动态创建的存储过程等。
选项 2 - 实体 - 键 - 值模式
这是我能想到的唯一现实的选择,我有 5 个表结构:
实体类型
EntityTypeID int
EntityTypeName nvarchar(50)
实体
EntityID 整数
EntityTypeID int
字段类型
FieldTypeID 整数
字段类型名称 nvarchar(50)
SQLtype int
字段值
EntityID 整数
FIeldID 整数
值 nvarchar(MAX)
字段
FieldID 整数
字段名 nvarchar(50)
FieldTypeID 整数
“FieldValues”表的工作方式有点像数据仓库事实表,我的所有插入/更新都将通过填充“键/值”表值参数并将其传递给 SPROC 来工作(以避免多次插入/更新)。
所有的表都会被大量索引,我最终会做很多自连接来获取数据。
我已经阅读了很多关于键/值数据库有多糟糕的信息,但对于这个问题,它似乎仍然是最好的。
现在我的问题!
- 除了这两个选项之外,任何人都可以提出其他方法或模式吗?
- 对于中等规模的数据集(最大 100 万行),选项 2 是否可行?
- 我可以使用选项 2 的进一步优化吗?
非常感谢任何方向和建议!
【问题讨论】:
-
玩了一会之后,我让 Mongo 与 Mongo/C# library 一起运行。对于这个特定示例,noRM 库的类型有点太强了,因为我将使用诸如 db.getCollection("Contacts") 之类的命令。感谢 pablochan 为我指明了正确的方向,并期待使用 noSQL 进行新的冒险!
标签: sql database non-relational-database object-relational-model