数据库设计支持动态实体

时间:2013-10-08 20:12:48

标签: sql-server database-design

好的,我不知道这个问题是否属于这个地方,但如果我错了,你会建议我。

我有一些实体具有几乎相同的属性,差异可能在2-3列。

由于这些不同的列,我无法创建一个表,其中列是每个实体的属性并集,因为新的实体类型将需要更改表设计,添加特定于该实体类型的新列。

相反,目前的工作设计是每个特定实体都有自己的表。

但是,如果新类型的实体出现,我必须创建新表,这是完全不好的主意。

如何创建一个包含每种实体类型的共享属性的表,以及一些用于证明实体唯一属性的其他机制?

因此,想法是轻松添加新类型的对象,而不更改数据库设计,仅配置处理唯一列的部分。

P.S。也许我不清楚,但如果需要,我会添加更多描述。

3 个答案:

答案 0 :(得分:2)

我曾经有过这样的设计。我所做的是创建了一个包含所有共享属性的表。然后,我有不同值的单独表。我使用连接将特定实体与其共享表行匹配。我只有不到10个,所以我的观点使用了工会,我刚刚更新了一个新的实体。但是,如果使用命名约定,则可以编写存储过程,动态查找表名,并动态执行联合和联接。在我的例子中,我使用基类和特定的类来创建自定义数据层。

另一种可能性是拥有一个通用表,它基本上是名称/值对,一个表代表您的共享属性。通过将表连接在一起,您可以为实体提供任意数量的实体特定属性。它不是很有效率,SQL会变得奇怪,但我已经看到它完成了。

答案 1 :(得分:2)

一种解决方案是将公共部分存储在一个表中,将特定部分存储在特定于该实体的表中。

例如:拥有一组人,其中一些人是经理......

人员表

PersonID
PersonName

经理表

ManagerID
PersonID
DepartmentManaged

一旦你走上了一个具有可变字段含义的表的路径 - 实际上是实体属性值设计 - 你发现自己在查询地狱。

答案 2 :(得分:1)

也许不是最好的或最具学术性的,但这种“开放式结构”呢?

MainTable :所有常用字段

SpecialProperties :额外属性,根据需要
- MainRecordId(P,F-> MainTable)
- PropertyName(P)
- PropertyText
- PropertyValue(用于数值)