我将使用 LLBLGen 来生成模型,但是我不想只使用它所拥有的任何内置继承工具来解决我的设计问题。无论 OR/M 工具如何,我都希望模型有意义。
所以,我有几种不同类型的实体,它们可以有地址,每个实体都可以有多个地址(主要地址、邮寄地址等)。
选项 1,使用超类型/子类型(如果您知道此类方案的确切名称,那将很有帮助)
表:EntityType [EntityTypeID, EntityTypeName](例如,Company=1,Employee=2,AnotherEntity=3)
实体:[EntityID,EntityTypeID,OriginID]:EntityTypeID=>EntityType
公司:[公司 ID、公司名称、...]
员工:[员工ID,名字,...]
AddressType:[AddressTypeID, AddressTypeName](例如,Primary=1,Mailing=2 等)
地址:[AddressID, AddressTypeID, EntityID, StreetAddress1, ...] : AddressTypeID=>AddressType, EntityID=>Entity
这样做的方式是,在创建任何 Company 或 Employee 之前,必须创建一个 Entity 记录并正确填写 EntityType。然后创建 Company 或 Employee 并将 Entity.OriginID 设置为 Company 或 Employee 的 ID。现在,地址记录将属于实体记录,这些记录将“绑定”到具体实体查看 EntityTypeID 和 OriginID。
我有点担心这需要的所有连接。更重要的是,我有点担心这在我的 ORM 工具 (LLBLGen) 中会很笨拙。
选项 2,这是对选项 1 的一种看法。我认为可能更糟,但包括它是一样的:
表:
EntityType:[EntityTypeID, EntityTypeName](比如,Company=1,Employee=2,AnotherEntity=3)
实体:[EntityID,EntityTypeID]:EntityTypeID=>EntityType
公司:[CompanyID, EntityID, CompanyName, ...] : EntityID=>Entity
员工:[EmployeeID,EntityID,FirstName,...]:EntityID=>Entity
AddressType:[AddressTypeID, AddressTypeName](例如,Primary=1,Mailing=2 等)
地址:[AddressID, AddressTypeID, EntityID, StreetAddress1, ...] AddressTypeID =>AddressType, EntityID=>Entity
这将类似于选项 1,因为对于公司或员工,将首先创建实体记录,并适当地设置实体类型。然后,将创建 Company 或 Employee 记录,并且先前创建的 Entity 记录的 EntityID 将设置在 Company 或 Employee 记录本身上。该地址将与实体本身相关联。然而,这似乎很奇怪,因为这会将地址记录视为公司和员工记录,即它们持有一个实体ID,但该引用意味着与公司和员工表中实体ID 引用的不同。
这似乎有点糟糕。它与第一个问题几乎相同,但我认为它也使模式不那么直观。
在这两种情况下,您都需要使用一些 Unique 约束,例如在 Company 表中(EntityID 在 Company 表中应该是唯一的)。但是,您需要执行一些其他程序检查以防止公司和员工记录指向相同的实体记录。我不知道像 LLBLGen 这样的工具是否可以通过智能地处理 EntityTypeID 值来对选项 1 执行任何“魔术”。
因此,选项 3 很简单:
表:
公司:[公司 ID、公司名称、...]
员工 [EmployeeID, FirstName, ...]
AddressType:[AddressTypeID, AddressTypeName](例如,Primary=1,Mailing=2 等)
CompanyAddress: [CompanyAddressID, AddressTypeID, CompanyID, StreetAddress1, ...] : AddressTypeID=>AddressType, CompanyID=>Company
EmployeeAddress: [EmployeeAddressID, AddressTypeID, EmployeeID, StreetAddress1, ...] : AddressTypeID=>AddressType, EmployeeID=>Employee
这使得连接更容易处理。但是,我不认为这真的可行。我有很多实体。我不仅有很多实体,而且我有很多可以有地址的实体。另外,这个“地址”只是一个例子,我还有很多其他类似于地址的东西。我不认为为每个人创建一个表格会在开发方面进行扩展。另外,我确信我可以让我的 ORM 让我使用代码将所有不同的地址视为相同的基本“地址”类型,但是,我不想依赖 ORM 可以做的技巧。
那么,这种超类型/子类型的东西是个好主意吗(我怀疑不是)?如果是,是否有更好的方法来解决它。如果没有,有什么更好的选择。