【发布时间】:2016-09-23 21:05:30
【问题描述】:
我正在查看现有的数据库架构,但我对以下示例中的 1:1 关系有点困惑:
Event
-----
id int (PK)
Title varchar
Description varchar
OrganizerId int (FK)
EventSchedule
------------
id int (Pk)
EventId int (FK)
Start datetime
End datetime
RepeatRule varchar (ical format for repeating events)
Venue
-----
id int (PK)
EventId (FK)
Name varchar
Address1 varchar
Address2 varchar
City varchar
Region varchar
Postcode varchar
latitude float
longitude float
活动只在一个地点举行,因此活动和场地之间存在 1:1 的关系。 同样,Event 与 EventSchedule 具有 1:1 的关系 - ical repeat 规则捕获重复事件。
这样分隔表格是否有任何理由或实例?如下有一个表会有什么问题:
Event
-----
id int (PK)
Title varchar
Description varchar
OrganizerId int (FK)
Start datetime
End datetime
RepeatRule varchar (ical format for repeating events)
Venue varchar
Address1 varchar
Address2 varchar
City varchar
Region varchar
Postcode varchar
latitude float
longitude float
对于每种设计的优缺点,我们将在上述上下文中特别赞赏一些建议,以使架构足够灵活,以供将来考虑世界场景,即 1:1 到 1:N 等。
【问题讨论】:
-
提议的模式似乎更灵活,可以接受大多数类型的事件,而你的模式似乎高度专业化(我发现场地不太可能只使用一次,并且发生的事件超过一次对我来说似乎并不罕见)。因此,答案通常是正确的答案可能完全取决于您的用例......
-
正如 fvu 所提到的,作为场地不太可能只使用一次。它也是分离所有实体类型的最佳实践(第 3 范式)。有了适当的规范化数据库,未来的开发和灵活性会容易得多。此外,您将能够在报告数据时消除复杂的查询。如果您的活动可以在不同的地点多次发生,我会尽可能创建 3 张桌子。 EventType(活动信息,如描述、名称等)、Events(场地与 EventType 之间的关系、日期、具体活动详情等)和场地。
-
@fvu Venue 表包括 FK EventId,它是 1:1 的关系。一个事件不能在多个位置发生 - 如果是,那么它将被归类为不同的事件并为该事件创建一个新记录。如果在同一地点发生了另一个事件,则会将具有相同地址详细信息的新记录插入到地点表中。那么如何使用同一个场地呢?同样,如果一个事件发生不止一次,详细信息将包含在 ical 重复规则中,即无需在 EventSchedule 表中为同一事件创建一行。
-
@ozzii 我忽略了 Venue 以这种方式与 Event 相关联的事实,这确实很奇怪。我宁愿在 Event 中使用 VenueId。 Wrt Eventschedule,例如,如果一个事件重复了 4 次但开始时间不同怎么办?无论如何,原来的结构似乎有严重的问题。
-
@fvu 为什么要在 Event 中使用 VenueId?组织者填写表格以创建活动,其中包括提供地点/地址详细信息。根据您的提议,如果不同的组织者在他们的活动中使用相同的场地记录,如果其中一个组织者决定更新场地/地址详细信息会发生什么。它将使用该 VenueId 级联到所有其他事件 - 这会很糟糕。
标签: database-design relationship database-schema one-to-one