简单的客人名单数据库设计

时间:2013-04-29 06:13:06

标签: database database-design

DB设计师的问题:

在派对的嘉宾名单中,我们将有东道主(组织和参加派对的人)和嘉宾(刚刚参加派对的人)。

有两种类型的宾客:

  1. 邀请卡的客人:在家中接受邀请卡的人,

  2. 没有邀请卡的客人:需要携带持有邀请卡的客人陪同的人士才能参加派对。

  3. 据了解,有必要注册第一类客人的地址,因为有必要知道放弃邀请卡的位置。 此外,对于每个访客,都需要知道邀请他们的主持人或访客ID。

    问题是:
    我应该创建多少个表? 一个人,其中包括所有观众? 两个表:一个用于主机,一个用于访客?
    三个表:一个用于主持人,一个用于有邀请卡的客人,另一个用于没有邀请卡的客人?

    我在第三个解决方案(三个表)中看到的优点是,我避免为没有邀请卡的访客留下空白字段“地址”,并且我可以使用邀请卡注册访客的ID要带他们去。

    我很高兴看到你的意见和想法。

3 个答案:

答案 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