sql - 动态数据库/键 - 值/实体 - 键值困境

标签 sql database non-relational-database object-relational-model

我从事关系数据库编程多年,但现在遇到了一个不寻常且棘手的问题:

我正在构建一个需要具有非常快速且易于定义的实体(由用户)的应用程序。然后可以创建、更新、删除这些实体的实例等。

我能想到两种选择。

选项 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/

相关文章:

sql - 获取表的主键名称

mysql - 如何使用非英语(孟加拉语)语言将数据输入此数据库表?

sql - 微软 Access : WHERE-EXISTS-clause not working on views?

database - SQL DataType - 如何存储一年?

c# - 如何根据组合框中的选定值从数据库中检索数据?

sql - 查询结果太多

android - Android 应用程序使用哪种数据库?

database - 建议: Non RDBMS database for a noob

python - python有非关系数据库吗?

nosql - 适用于中小型应用程序的非关系数据库(NoSQL)