1

假设我正在编写供派对策划者使用的软件。这是我当前的数据库架构的样子:

Parties ( PartyId, ClientId, DateTime )
Tents ( PartyId, TentDetails... )
Clowns ( PartyId, ClownDetails... )
SecurityAgentAssignment ( PartyId, AgentId, fromTime, untilTime )

如您所见,一个派对可以有多个帐篷、小丑和安全特工分配给它。

现在,派对策划师经常策划相同类型的派对:​​大多数有一个帐篷,一个小丑,没有保安;但还有另一种常见的派对类型,有三个帐篷,没有小丑,三个保安人员参加派对。他们希望能够存储“预设”(也称为“派对包”或“派对模板”),选择这些预设会在数据库中添加必要的帐篷、小丑和安全行。派对仍然可以像往常一样自定义,当然,这只是最小化初始数据输入的一种手段。

现在的问题是,我将如何实现它?

最直接的方法是复制TentsClownsSecurityAgentAssignment表并添加一个新Packages表,如下所示:

Packages ( PackageId, Name )
Package_Tents ( PackageId, TentDetails... )
Package_Clowns ( PackageId, ClownDetails... )
Package_Security ( PackageId, AgentId )

然后 biz 逻辑必须Tent从行创建Package_Tent行,它不能通过INSERT INTO SELECT FROM语句来完成,因为两个模式不同(例如,Package_Security缺少fromTimeanduntilTime字段)。

这种方法简单且有效,但存在一些问题:

  1. 这意味着只为 Package 系统复制大量表。这就是项目变得臃肿的方式。
  2. 它引入了额外的维护层:如果我修改原始表,那么我也必须修改这些表。
  3. 不知何故,这似乎是“错误的”。

第二种方法意味着使用现有表,但添加一个新表,如下所示:

Packages ( PackageId, Name, PartyId )

Packages表链接到现有Party行(及其关联的帐篷、小丑和安全行)。它链接到的派对不存在(或者更确切地说,它的细节无关紧要),它成为新派对的模板,只需在单个表中复制行,而不是在另一个表中创建新表中的行桌子。这种方法还有一个优点是允许用户使用现有的 GUI 来修改包作为原型方,而不是拥有单独的 GUI 工具/区域。

但是它存在“杂质”:现在一个政党的状态如何作为“政党”而不是“政党模板”取决于它是否是Packages表中的外键。这也意味着存在无效或无意义的数据(例如,在聚会模板中使用fromTimeand for Security 是没有意义的)。untilTime

StackOverflow 是否偏爱一种方法而不是另一种方法,还是有第三种方法?

4

2 回答 2

1

采用第二种方法绝对是有意义的。每种设计都有其优点和缺点,但第二种方法(重用模式和 GUI)的优点远远超过任何小问题。

就个人而言,我不认为您提到的任何问题都是架构中的“杂质”,而是需要在应用程序中明确说明的业务约束,例如:

  • 如果编辑派对模板,忽略fromTimeand untilTime,并在 GUI 中隐藏它们
  • 如果编辑常规派对,请确保fromTime并且untilTime有效
于 2012-09-06T06:00:16.197 回答
0

在我看来,模板就是这样,模板:预设。您可以将预设值存储为 xml。让您在不破坏表结构的情况下更改模板的范围很广,并且只有应用程序代码需要在运行时处理解析和翻译 xml。这里唯一的缺点是如果模板变得太大,xml 可能会变得难以管理。但是对于中小型使用和有效的 DAO/ORM 层,您的配置将与 Party_Template(template_id,template_title,template_desc)

于 2012-09-08T00:01:09.103 回答