DB设计师的问题:
在派对的嘉宾名单中,我们将有东道主(组织和参加派对的人)和嘉宾(刚刚参加派对的人)。
有两种类型的宾客:
邀请卡的客人:在家中接受邀请卡的人,
没有邀请卡的客人:需要携带持有邀请卡的客人陪同的人士才能参加派对。
据了解,有必要注册第一类客人的地址,因为有必要知道放弃邀请卡的位置。 此外,对于每个访客,都需要知道邀请他们的主持人或访客ID。
问题是:
我应该创建多少个表?
一个人,其中包括所有观众?
两个表:一个用于主机,一个用于访客?
三个表:一个用于主持人,一个用于有邀请卡的客人,另一个用于没有邀请卡的客人?
我在第三个解决方案(三个表)中看到的优点是,我避免为没有邀请卡的访客留下空白字段“地址”,并且我可以使用邀请卡注册访客的ID要带他们去。
我很高兴看到你的意见和想法。
答案 0 :(得分:0)
问题总是有一个以上的解决方案(好吧,大部分时间都存在)。因此,您可以通过多种方式执行此操作,只需一个表,两个或三个。您可以将所有这些放在一个表中,设置主持人的标志,邀请的访客并带来访客,以及一个“邀请者”字段,该字段指向他被邀请者的身份(主持人或受邀嘉宾)在)。 您可以使用两个表,一个用于主机,一个用于客户。通过这种方式,您可以将“带来的”客人推荐给受邀嘉宾,并将所有客人推荐给相应的主人。它还使您能够捕获带来的客人的地址,这绝不是一个坏主意。 您可以使用三个表:hosts,guests,guests2hosts。与上面相同,但是主机和来宾之间的多对多关系(在guest2hosts表中),这使您可以邀请多方参与。 我想如果你进一步考虑它,你可以想出更多可能的DB布局。 创建数据库是您需要仔细考虑的事项,当前的需求以及未来可能的需求。许多系统现在运行良好,但由于数据库设计蹩脚,因此无法扩展。
答案 1 :(得分:0)
至少有五张桌子。
Host
----
Host ID
Host Name
...
Invited Guest
-------------
Invited Guest ID
Invited Guest Name
Invited Guest Address
...
Guest
-----
Guest ID
Guest Name
...
Party
-----
Party ID
Host ID
Party Time stamp
Party Address
...
Party Guest
-----------
Party Guest ID
Party ID
Invited Guest ID
Guest ID
...
我总是将表的主(聚类)键定义为自动递增整数或长整数。
外键应该是名字明显的。 Party Guest表中的Guest ID外键是可以为空的外键。受邀嘉宾可以邀请客人,但不必。
另外两个表将有助于最大限度地减少上述五个表中的重复数量。
Name
----
Name ID
Name
Address
-------
Address ID
Address
由于一方的访客可能是另一方的主持人,因此这些表可以最大限度地减少数据重复。
您只需使用名称ID替换每个名称列,并使用地址ID替换每个地址列。
答案 2 :(得分:0)
好的,这是一个更通用的选择:
person
-----------
person_id
name
event
-----------
event_id
name
event_begin_datetime
event_end_datetime
person_event
--------------
person_id
event_id
role_code <-- use this to indicate which type of guest or host
invitation_mailed <-- helpful flag which may otherwise be derivable based on role
address
--------------
address_id
other address fields
person_address
-------------
person_id
address_id
event_address
--------------
event_id
address_id