有一个客户的新crm场景,他们有供应商和客户,供应商也是客户,反之亦然。每个层级的表只会让一个人只能是一个或另一个,所以我认为每种类型的表更适合。实体框架继承
DB结构将是:
[Contact]
ContactId pk
Name
...
[Client]
ContactId pk/fk
VATNumber
...
[Supplier]
ContactId pk/fk
...
任何人有从类似的情景其他任何建议或经验?
有一个客户的新crm场景,他们有供应商和客户,供应商也是客户,反之亦然。每个层级的表只会让一个人只能是一个或另一个,所以我认为每种类型的表更适合。实体框架继承
DB结构将是:
[Contact]
ContactId pk
Name
...
[Client]
ContactId pk/fk
VATNumber
...
[Supplier]
ContactId pk/fk
...
任何人有从类似的情景其他任何建议或经验?
每种类型的表也将假设一个Contact
是客户端或供应商(如果您查看生成的SQL,则更清晰:例如,请参阅"Inheritance with EF Code First CTP5: Part 2 – Table per Type (TPT)")。
相反,我认为你需要改变你的模型为Contact
和Contact-Role
与一对多的关系。 Contact-Role
将有Supplier
和Client
亚型。整个Contact-Role
层次可以被映射为TPH或TPT。
这反映了一个面向对象的设计,其中每个客户都有一个或多个角色(继承“是一个” releationship,永远是独特的,你不能有抽象类型client
这同时是client
两种亚型的对象)。
这是行不通的,除非你将它建模为三级继承,这将要求客户始终是供应商或供应商始终是客户。我想这是不正确的模型在你的应用程序,这意味着你不能使用继承。
您必须在contact-client和contact-supplier之间使用一对一(0..1-1)的关系,或者您可以简单地将所有属性放在单个表中,并添加IsClient
和IsSupplier
位列 - 它不是很好,它的可扩展性较差,但使用起来非常简单。这两个比特列在关系表示的情况下也是有用的。
谢谢理查德,这很有趣,你能详细说明一下吗? – Chev 2011-05-29 09:04:41
@Chev:我会试试。 – Richard 2011-05-29 10:22:46