2013-10-08 39 views
0

好吧,我不知道这个问题是否属于这个地方,但是如果我错了,你会建议我。支持动态实体的数据库设计

我有一些实体具有几乎相同的属性,差异可能是2-3列。由于这些不同的列,我不能创建一个表中的每个实体的属性联合的列,因为新的实体类型将需要更改表设计添加特定于该实体类型的新列。

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

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

如何创建一个由每个实体类型的共享属性组成的表以及一些用于证明实体独特属性的附加机制?

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

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

+0

您是使用实体框架还是其他一些ORM? –

+0

实体是表中记录的术语,在这种情况下 – veljasije

+0

你应该研究“子类”和ORM的。这将帮助你弄清楚什么是选项,即使你“自己推出”。这里是一个初学者的文章:http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat – granadaCoder

回答

2

我曾经有过这样的设计。我做的是我创建了一个容纳所有共享属性的表格。然后,我为不同的值分开了表格。我使用连接将特定的实体与其共享的表格行进行匹配。我有不到10个,所以我的观点使用了我刚添加新实体时更新的联合。但是,如果您使用命名约定,则可以编写存储过程,以动态查找表名,并实时进行联合和联接。就我而言,我使用了一个基类和特定的类来创建自定义数据层。

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

+0

好吧,这是一种方法,但是当传入新对象时,我必须更改数据库设计,以及映射这些新表格的代码。 – veljasije

+0

这是真的。我添加了另一个解决方案,一旦这种解决方案更具活力,但难以实施。 –

2

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

例如:要有一套的人,其中一些人是经理...

人表

PersonID 
PersonName 

经理表

ManagerID 
PersonID 
DepartmentManaged 

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

1

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

MainTable:所有共用字段

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