我有一个系统,用户可以在其中声明各种类型的对象-
Teams,
Facilities,
Equipment,
Personnel
用户由“单元”表示——组织馅饼的一个独立切片。在为这些对象之一创建声明后,他们可以设置声明的状态。看起来很简单,对吧?
好吧,这就是头痛的开始。如上所述,这些东西形成了一个松散的层次结构。超级用户使用少量链接表为每个对象创建模板。团队可以由设施、设备和人员组成,设施由设备和人员组成,单元可以为他们想要的任何东西创建索赔。非常灵活,但在后端很烦人。
团队、设施、设备和人员具有完全相同的列:
Id,
Name,
Description,
DateCreated,
CreatedById,
IsArchived
为了与 ORM 概念保持一致,现在每一个都是一个单独的表。当用户需要创建声明时,真正的痛苦就来了。层次结构将为我们留下以下表格:
TeamClaim, FacilityClaim, EquipmentClaim, PersonnelClaim, TeamFacilityClaim,
TeamEquipmentClaim, TeamPersonnelClaim, so on and so forth.
加上每个这些索赔表的另一个状态表。
显然,这只是垃圾。
因此,我将设计更改为一个名为 ClaimableItem 的表。它具有上述定义的列,以及“类型”列;这只是一个三个字母的表示。然后我创建了一个名为Claim 的表——它包含所有必要的列,并具有定义为ClaimableItemId 和ClaimableItemType 的复合唯一键。
我已经用我的 C# 代码对此进行了测试。EF4 可能讨厌重复使用密钥,但是一个小的解决方法(hack)使它相对容易完成;我可以在大约一个小时内更改我的所有模型、视图和控制器代码以适应新内容。
我的问题(最后)是这样的:我的新单桌设计是废话吗? 它使我的数据库不会被表弄得乱七八糟,实际上会加快添加新的 ClaimableItem 类型——无需为它们创建新对象。我的问题是,三个字母的表示不直观,值得一废,必须在代码中处理,这对我的纯粹主义者有点恼火。
任何人都有更好的想法如何做到这一点?