数据库设计问题 - 字段或新表+一对多

时间:2008-10-18 16:45:39

标签: database-design normalization

我正在为事件管理网站设计一个数据库 - 有一个场地表和一个事件表。每个活动都在一个场地(存储场地的id),每个场地都在一个城市。如果城市是场地表中的一个场地(由于拼写错误可能导致重复的城市),或者应该有一个城市表(每个都有一个id和一个名字),并且必须能够按城市搜索事件。连接城市和场地的一对多表格(cityid,venueid)?

我知道这是一个非常基本的问题,但我不确定额外的连接和额外的两个表是否值得。

提前致谢

[编辑] @tvanfosson:由于每个场地与一个城市相关联,因此从多对多变为一对多。

7 个答案:

答案 0 :(得分:3)

使用单独的表格 - 通过这种方式,您可以使用城市主列表来填充下拉列表和/或自动提取字段,可以通过冗余存储ID而不是字符串来节省空间。如果您拥有一百万个场所,而且只有一千个城市,那么无论是在存储方面还是在查询速度方面,都可以节省大量成本 - 因为您不必从磁盘上读取太多内容,这就是杀死性能的原因。

您可能应该指定的不仅仅是一个城市,还要指定州(以便您知道该场地所在的Springfield)。

答案 1 :(得分:1)

我认为这组城市是固定的,相对较小,并且不太可能更新(对于拼写,你总是可以添加新的城市)。在这种情况下,提供从XML文件提供的下拉列表中选择城市的功能,并将选定的值存储在列中的数据库中。由于输入错误的可能性,我会避免使用用户提供的输入。

如果您有一个更多层次结构,其中城市位于各州的县,那么基于表格的方法可能更合适,因为您可以在多个位置拥有相同名称的城市。在这种情况下,我认为使用数据库查询比使用XML更容易管理级联下拉列表。

注意:可能没有“正确”的答案,因为它在很大程度上取决于您的情况。

答案 2 :(得分:0)

考虑使用地址表和城市列可能值得考虑。

解决方案实际上取决于其他功能是什么,以及数据库将来是否会用于其他功能。

这也是一个主观选择,在我看来,单独的城市表可能会略微过于正常化。

答案 3 :(得分:0)

将城市和场地之间的多对多关系转换为与附加表(类似于venue_city)的一对多关系,您可以在其中存储每个城市的所有场地,然后链接表格事件和表格venue_city将venue_city id存储到表事件中。

答案 4 :(得分:0)

你应该有一张城市表 - 即使你现在不需要它,你可能想要添加邮政编码,或者让城市处于州。

答案 5 :(得分:0)

如果我理解你的情况,必须使用城市表,包括州。您可以根据需要添加新的城市/州(在添加之前检查表中是否存在)。它会更有效率,避免重复,但拼写错误的城市名称。

答案 6 :(得分:0)

不要将城市名称存储在场地中。而是分配一个城市ID并将其存储在场地中。在您加入以查找特定城市的活动之前,请从城市名称解析城市ID,并将其用作您的加入条件。为了方便和提高性能,这可以在存储过程中实现。