【问题标题】:Prevent Circular References in Database Design防止数据库设计中的循环引用
【发布时间】:2013-04-12 17:40:58
【问题描述】:

我有这些表:

--位置(ID)

--演唱会(ID , LocationID_FK)

--演出时间(ID , ConcertID_FK)

--SeatBlock (ID , ShowtimesID_FK)

--Seat (ID , SeatBlockID_FK)

现在我有一个名为 SeatValue 的实体。这个实体是一些座位的值,如 Golden、Silver 等。对于这个实体,每条记录都必须有一个指定的 Showtime。 我认为这是解决方案:

SeatValue (ID , ShowtimesID_FK)

座位更改为:

--Seat (ID , SeatBlockID_FK , SeatValueID_FK)

但我认为这是创建 cicular 参考。不是吗? 怎么改?

【问题讨论】:

  • 为什么不将您的座位值作为对座位的零或一参考?
  • SeatValue 有一些记录,它必须与 Seat 分开。它有名称和价格。

标签: database database-design circular-reference


【解决方案1】:

在这种情况下,我会提出以下建议:

  • 位置(ID、元数据)
  • 音乐会(ID、LocationID_FK、元数据)
  • 放映时间(ID、ConcertID_FK、元数据)
  • SeatBlock(ID、Location_FK、元数据)
  • 座位(ID、SeatBlockID_FK、元数据)
  • SeatPricing(ID、Seat_FK [或 SeatBlock_FK,如果按块定价]、ShowTime_FK、元数据)
  • SeatAssignment(ID、SeatPricing_FK、Seat_FK [如果座位定价按块完成]、元数据)

【讨论】:

  • 感谢您的回复。但是如果我有一个用于音乐会#1 的 Block A 和另一个用于音乐会 #2 的 Block A,我该如何将它们分开?
  • 嗯,你不会为不同的音乐会设置不同的街区,除非你在物理上重新安排你的座位。积木与音乐会无关;仅当某人在特定音乐会的那个街区的座位上坐下时,它们才与音乐会有关。我认为您正试图在您的层次结构中过早地链接静态信息和动态信息。
  • SeatBlock的定义是什么?实际座位安排是由 SeatID 驱动的,还是可能因音乐会而异的定价层的虚拟表示?这还不清楚。在后一种情况下,SeatBlock 将由 Concert 或 Showtime 驱动。但是您真的希望 SeatValue 会因给定音乐会的 Showtime 而变化吗?
  • @JAGAnalyst,我的定义是基于物理位置的;我认为 OP 试图将物理位置与定价属性结合起来,这确实需要规范化。
  • SeatBlock , 包含一些座位,它不会随着音乐会而改变。但是每场音乐会或演出时间的座位价值都会发生变化。例如在皇家阿尔伯特音乐厅举行的阿黛尔音乐会,位置和座位座没有变化,但价格从另一场音乐会改变。
【解决方案2】:
  • 剧院存在。
  • 音乐会存在。
  • 剧院分为座位区。
  • 座椅是座垫的一部分。
  • 音乐会安排在剧院演出。
  • 演出有座位出售。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多