0

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

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

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

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

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

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

因此,想法是在不改变数据库设计的情况下轻松添加新类型的对象,只配置处理唯一列的部分。

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

4

3 回答 3

2

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

例如:要有一组人,其中一些是经理……

人表

PersonID
PersonName

经理表

ManagerID
PersonID
DepartmentManaged

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

于 2013-10-08T20:45:19.590 回答
2

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

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

于 2013-10-08T20:24:05.723 回答
1

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

MainTable : 所有常用字段

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

于 2013-10-08T20:53:15.023 回答