0

数据库设计师的一个问题:

在聚会的客人名单中,我们将有主持人(组织和参加聚会的人)和客人(刚刚参加聚会的人)。

有两种类型的客人:

  1. 持邀请卡的客人:在家中亲自领取邀请卡的客人,以及

  2. 无邀请卡客人:需由持有邀请卡客人陪同方可进入派对。

据了解,需要登记第一类客人的地址,因为需要知道将邀请卡放在哪里。此外,对于每位客人,都需要知道邀请他们的主持人或客人 ID。

问题是:
我应该创建多少个表?
一个,所有观众都在里面?
两张桌子:一张给主人,一张给客人?
三张桌子:一张给主人,一张给有邀请卡的客人,一张给没有邀请卡的客人?

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

我很高兴阅读您的意见和想法。

4

3 回答 3

0

问题的解决方案总是不止一种(好吧,大多数时候都有)。因此,您可以通过多种方式做到这一点,一张桌子、两张桌子或三张桌子。你可以把它们都放在一张桌子上,设置一个主人、受邀客人和带客人的标志,以及一个“邀请者”字段,该字段指向他被邀请的人(主持人或受邀客人)的 id在)。你可以使用两张桌子,一张给主人,一张给客人。通过这种方式,您可以将“带来”的客人介绍给受邀的客人,并将所有客人介绍给他们相应的主人。它还使您能够捕获所带来客人的地址,这绝不是一个坏主意。您可以使用三个表:hosts、guests、guests2hosts。和上面一样,但是主机和客人之间是多对多的关系(在guests2hosts表中),这使您可以邀请受邀参加多个聚会的客人。而且我想如果您进一步考虑它,您可能会想出更多可能的 DB 布局。创建数据库是您需要非常仔细地考虑当前需求以及可能的未来需求的事情。许多系统现在运行良好,但由于糟糕的数据库设计而无法扩展。

于 2013-04-29T06:21:34.537 回答
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。

于 2013-04-29T09:53:50.290 回答
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
于 2013-04-29T12:52:12.073 回答