我试图解决的问题并不是一个过于复杂的问题,而是我想尝试解决的问题比现在更优雅。
问题:
我们与多家公司开展业务。为了争论,我们可以说每家公司都生产汽车。每个公司都有不同的实现(即必须持久保存到数据库中的数据)。当客户订购汽车时,您无法知道他们可能会购买哪种类型的汽车,因此需要一个名为“车辆”的单一表格。它建立了CustomerId,一个独特的VehicleId,我们数据库的内部,全局唯一以及某种复合键之间的关系,这种复合键在许多CompanyX_Vehicle表中都是唯一的。
An example would be: Top level lookup table: VehicleId CustomerId CompanyId CompanyVehicleId CompanyAVehicle Table: CompanyAVehicleId ------> Part of composite key CompanyId ------> Part of composite key ...... unique implementation and persistence requirements. CompanyBVehicle Table: CompanyBVehicleId ------> Part of composite key CompanyId ------> Part of composite key ...... unique implementation and persistence requirements.
我必须出于显而易见的原因禁用外键实施,但是在代码中(在本例中为C#,EF),我可以执行单个查询并急切地从正确的CompanyXVehicle表中包含必要的数据。
或者,我可以省略任何类型的关系,每次只执行两次查询,一次查询公司和公司车辆ID,然后拨打必要的表格。
但是我觉得有更好的替代方案来解决这些问题。有没有人对如何解决这个特殊问题提出建议?
答案 0 :(得分:0)
我会回答........所以这可以被关闭(最终如果没有其他人提出更好的答案)。
虽然有几种方法可以做到这一点,但我更喜欢DRY方法。
这是:
基类/表具有PK和所有相同的标量。
针对不同"类型的不同子类(表)"实体这将具有该类型唯一的标量。
Animal(Table)
AnimalSurrogateKey (int or guid)
Species (lookup table FK int)
Birthddate (datetime, null)
Dog(Table)
ParentAnimalSurrogateKey (int) PK,FK
BarkDecibels (int)
Snake(Table)
ParentAnimalSurrogateKey (int) PK,FK
ScaleCount (int)
类似的东西。
ORM可以处理这个问题。手动/手动ORM可以处理....
您可以查询有关" Animals"的一般信息。 或者您将有多个查询来获取所有子类型信息。
如果您需要查询关于Dogs的基本信息,那就是
Select AnimalSurrogateKey , Species , Birthdate from dbo.Animal a where exists (select null from dbo.Dog d where d.ParentAnimalSurrogateKey = a.AnimalSurrogateKey )
..........
关键是要遵循既定的"模式"用于处理这些场景。大多数问题已经被考虑过了........未来的开发人员会感谢你在评论/文档中提及"我们实施了等等等等模式来实现"。
APPEND:
(使用来自http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server的信息)
这是一篇很棒的文章。同样,你必须判断EF是否足够好"或不........如果它不是,那么你可以手动执行你的ORM ...(以解决多个查询问题)...也许测试这样的查询...... ......
select p.PersonID , p.PersonTypeID , s.EnrollmentDate , t.HireDate , par.DifficultyScore
from dbo.People p
left join dbo.Students s on p.PersonID = s.PersonID
left join dbo.Teachers t on p.PersonID = t.PersonID
left join dbo.Parents par on p.PersonID = par.PersonID
然后你可以手动将你的ORM用于"切换/案例"关闭PersonTypeID,并使用每个子类唯一的数据创建子类(注意类型关闭的行,您将具有空值.......例如:如果您的子类型是"学生&# 34;,那么该行的par.DifficultyScore将为null。)
在某些时候,您必须选择POC(概念证明)。你有一个问题,有很多方法可以解决它....你必须测试它。 EF可能足够好......可能不是。因此,为什么我首先去POCO ...所以如果EF表现不够好,我可以去ado.net/old-school/idatareaders。
祝你好运。