用单表抽象不同的实现

时间:2015-10-23 00:22:12

标签: sql-server tsql

我试图解决的问题并不是一个过于复杂的问题,而是我想尝试解决的问题比现在更优雅。

问题:

我们与多家公司开展业务。为了争论,我们可以说每家公司都生产汽车。每个公司都有不同的实现(即必须持久保存到数据库中的数据)。当客户订购汽车时,您无法知道他们可能会购买哪种类型的汽车,因此需要一个名为“车辆”的单一表格。它建立了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,然后拨打必要的表格。

但是我觉得有更好的替代方案来解决这些问题。有没有人对如何解决这个特殊问题提出建议?

1 个答案:

答案 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。

祝你好运。