Database design 扩展应用程序设计-从数据库中已有的模板自动生成数据项
假设我正在为派对策划人编写软件。这就是我当前的数据库架构:Database design 扩展应用程序设计-从数据库中已有的模板自动生成数据项,database-design,Database Design,假设我正在为派对策划人编写软件。这就是我当前的数据库架构: Parties ( PartyId, ClientId, DateTime ) Tents ( PartyId, TentDetails... ) Clowns ( PartyId, ClownDetails... ) SecurityAgentAssignment ( PartyId, AgentId, fromTime, untilTime ) 如你所见,一个派对可以有多个帐篷、小丑和安全人员 现在,派对策划人经常策划同一类型的派
Parties ( PartyId, ClientId, DateTime )
Tents ( PartyId, TentDetails... )
Clowns ( PartyId, ClownDetails... )
SecurityAgentAssignment ( PartyId, AgentId, fromTime, untilTime )
如你所见,一个派对可以有多个帐篷、小丑和安全人员
现在,派对策划人经常策划同一类型的派对:大多数都有一个帐篷,一个小丑,没有安全设施;但也有另一种常见的派对,有三个帐篷,没有小丑,还有三名保安人员参加。他们希望能够存储“预设”(也称为“派对套餐”或“派对模板”),选中这些预设后,将在数据库中添加必要的帐篷、小丑和安全行。派对仍然可以像往常一样定制,当然,这只是一种最小化初始数据输入的方法
现在的问题是,我将如何实现这一点
最直接的方法是复制帐篷
、小丑
和安全代理设计
表,并添加一个新的包
表,如下所示:
Packages ( PackageId, Name )
Package_Tents ( PackageId, TentDetails... )
Package_Clowns ( PackageId, ClownDetails... )
Package_Security ( PackageId, AgentId )
然后,业务逻辑必须从Package\u Tent
行创建Tent
行,这不能通过INSERT-INTO-SELECT-from
语句来完成,因为这两个模式不同(Package\u-Security
缺少fromTime
和untilTime
字段)
这种方法简单有效,但也存在一些问题:
Packages ( PackageId, Name, PartyId )
此打包
表链接到现有的派对
行(及其关联的帐篷、小丑和安全行)。它链接到的一方是不存在的(或者更确切地说,它的详细信息无关紧要),它成为新的一方的模板,只需复制单个表中的行,而不是从另一个表中创建新表中的行。这种方法还有一个优点,即允许用户使用现有GUI作为原型方修改包,而不是使用单独的GUI工具/区域
然而,它受到“不洁”的影响:现在一个缔约国作为“缔约方”而不是“缔约方模板”的状态如何取决于它是否是包
表中的外键。这还意味着将存在无效或无意义的数据(例如,在参与方模板中使用fromTime
和untilTime
以确保安全性是没有意义的)
StackOverflow是喜欢一种方法而不是另一种方法,还是有第三条出路?选择第二种方法肯定是有意义的。每种设计都有其优点和缺点,但第二种方法(重用模式和GUI)的优点远远超过了任何小问题 P>个人,我不认为你提到的任何问题都是模式中的“杂质”,而是它们在应用程序中需要明确的业务约束,例如:
- 如果编辑参与方模板,请忽略
和fromTime
,并将其隐藏在GUI中untilTime
- 如果编辑定期聚会,请确保
和fromTime
有效untilTime
- 如果编辑参与方模板,请忽略
和fromTime
,并将其隐藏在GUI中untilTime
- 如果编辑定期聚会,请确保
和fromTime
有效untilTime
- 在我看来,模板就是这样,模板:预设。可以将预设值存储为xml。允许您在不破坏表结构的情况下更改模板,并且只有应用程序代码需要在运行时解析和翻译xml。这里唯一的缺点是,如果模板太大,xml可能变得不可管理。但是对于中小规模的使用和一个有效的DAO/ORM层,您的配置将在
派对模板(模板id、模板标题、模板说明)在我看来,模板就是这样,模板:预设。可以将预设值存储为xml。允许您在不破坏表结构的情况下更改模板,并且只有应用程序代码需要在运行时解析和翻译xml。这里唯一的缺点是,如果模板太大,xml可能变得不可管理。但是对于中小规模的使用和一个有效的DAO/ORM层,您的配置将在
参与方模板(模板id、模板标题、模板描述
)