我正在构建一个简单的数据库驱动的 Web 应用程序,但是通过阅读很多关于这个主题的书籍,我知道如果我的数据库搞砸了,那么我的应用程序也很可能会搞砸。
所以我想我会咨询数据库设计专家,并在进一步进行之前获得他们的帮助来审查我的想法。
应用程序:
将在 Google 地图上向最终用户提供 [活动信息] 的网站。有问题的事件是新书签名活动。
我想,人们阅读很多(我是其中之一),并且喜欢阅读,如果有一个用户可以访问的网站会很好:
- 输入他们的邮政编码(邮政编码),并在设定的英里半径范围内获取他们附近的所有事件。
- 输入他们最喜欢的作者姓名,并在世界地图上显示他/她的所有事件。
好主意不是吗?反正我是这么认为的:)
好的,基于以上,我知道我的事件表肯定包含一些地理信息,所以我读了这个。并为我的数据库想出了类似的东西。
- 一场活动可以接待多位图书作者
- 一位作者一次只能参加一个活动。
ERD 图 http://img24.imageshack.us/img24/6614/entityrelationshipdiagr.jpg
我意识到这是一个简单的数据库设计,但我的应用程序(至少现在)有一个非常简单的目标,那就是在 Google 地图上显示事件信息。
我将不胜感激任何反馈,我将来会遇到的任何陷阱……等等?
谢谢你。
通常,事件不是无限的。有不止一种方法可以在您的数据库中表示它:存储一个
endTime
, 或一个duration
. 如果你不想强迫人们这样做,你可以把它设为可选,但如果活动在下午 4 点开始,有人在晚上 11 点出现,他们会因为错过了活动而感到失望,而且你的应用程序显然不够清晰甚至在晚上 9 点结束。你可能会成为他们批评的对象(是否合理是另一回事)。您可能还想添加一个
notes
字段,该字段只是一些文本,任何人都可以添加该字段以获取事件的特殊信息。此外,此设计不允许One Event Can Host Many Book Authors。从你的图表来看,一个事件似乎只能有一个作者。您可能需要一个像这样的新表:
如果您使该表具有复合键
event_id
和author_id
,它将允许您拥有具有相同事件和不同作者的多条记录。当然,您必须author_id
从events
.至于一个作者一次只能参加一个活动。,这个有点棘手。您当前的架构不强制执行此操作,但我想您可以在您的应用程序中执行此操作。或者您可以在插入时触发
event_authors
,首先检查该作者的新事件的持续时间是否与同一作者的不同事件的任何其他事件重叠。author是一个法人,和attendee一样,所以你可以把他们放在一个Party表里,给他们一个Role,比如“author”或者“attendee”。一个人可以扮演作者或与会者或两者的角色。
事件发生在设施处,设施是地址的一种。
地址位于邮政/邮政编码处,这是一个地理位置。地址也位于城市(或其他地理区域)中,这也是一个地理位置。城市和邮政编码没有等级关系。
如果一个事件可以承载许多作者,那么您需要一个 author_event 联结表。
(注意:author_event.event_id 应该是整数而不是 varchar)