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
      untilTime
      ,并将其隐藏在GUI中
    • 如果编辑定期聚会,请确保
      fromTime
      untilTime
      有效

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

    P>个人,我不认为你提到的任何问题都是模式中的“杂质”,而是它们在应用程序中需要明确的业务约束,例如:

    • 如果编辑参与方模板,请忽略
      fromTime
      untilTime
      ,并将其隐藏在GUI中
    • 如果编辑定期聚会,请确保
      fromTime
      untilTime
      有效

      • 在我看来,模板就是这样,模板:预设。可以将预设值存储为xml。允许您在不破坏表结构的情况下更改模板,并且只有应用程序代码需要在运行时解析和翻译xml。这里唯一的缺点是,如果模板太大,xml可能变得不可管理。但是对于中小规模的使用和一个有效的DAO/ORM层,您的配置将在
        派对模板(模板id、模板标题、模板说明)

        在我看来,模板就是这样,模板:预设。可以将预设值存储为xml。允许您在不破坏表结构的情况下更改模板,并且只有应用程序代码需要在运行时解析和翻译xml。这里唯一的缺点是,如果模板太大,xml可能变得不可管理。但是对于中小规模的使用和一个有效的DAO/ORM层,您的配置将在
        参与方模板(模板id、模板标题、模板描述