1

我有两个实体:EventLocation。关系是:

1 个事件可以有1 个位置1 位置可以有许多事件

基本上我想存储事件。每个活动都在特定位置举办。当我说具体位置时,我的意思是:

Street, Number, City, Zip Code, State, Country

我基本上有一个设计问题,我需要一些帮助:

1 - 现在我正在考虑做以下事情:

事件表将有一个location_id指向位置表中特定位置行的。这会发生什么:我将在每一行中有许多重复的值。例如,如果一个事件正在旧金山的356 Matilda Street 发生,而另一个事件正在旧金山的890 Matilda Street 发生。值 Matilda Street 和 San Francisco 将在位置表中重复多次。我该如何重新设计以使其正常化?

所以,基本上我很想听听一个用关系数据库(如 MySQL)来解决这个问题的好方法。

4

4 回答 4

1

表中的每个位置locations都应由其唯一标识PRIMARY KEY。然后,表中的记录通过events包含 that 的值的列引用它们的关联位置PRIMARY KEY

例如,您的位置表可能包含:

location_id | 街道 | 号码 | 城市 | 邮政编码 | 状态 | 国家
------------+----------------+--------+------------ ----+----------+--------+----------
          1 | 玛蒂尔达街 | 356 | 旧金山 | 12345 | 加利福尼亚州 | 美国
          2 | 玛蒂尔达街 | 890 | 旧金山 | 12345 | 加利福尼亚州 | 美国

那么您的events表可能包含:

event_id | location_id | 日期 | 描述
---------+-------------+------------+------------- ---
       1 | 1 | 2012-04-28 | 生日聚会
       2 | 1 | 2012-04-29 | 宿醉派对
       3 | 2 | 2012-04-29 | 葬礼
       4 | 1 | 2012-05-01 | 劳动节!

在此示例中,location_id是表PRIMARY KEY中的和表中的 a。locationsFOREIGN KEYevents

于 2012-04-28T17:05:26.413 回答
1

如果您想要一个严格规范化的数据库,您可以有一个用于街道名称的表,另一个用于城市,另一个用于州,等等。您甚至可能有一个额外的location表格,其中包含街道、城市和州的独特组合;每次在以前未知的位置发生事件时,您都会在此表中添加行。然后,您的每个事件都会引用表中的相应行location

但在实践中,有时最好将位置数据直接存储在events表中并容忍额外的内存使用;在速度和内存使用之间总是存在权衡。

另一个考虑:如果一条街道被重命名会发生什么?您希望旧事件与旧名称还是新名称相关联?

于 2012-04-28T17:06:10.310 回答
0

您的 Locations 表应该有一个唯一的 ID,例如 1=Matilda Street, 2=Market Street - 每个可能的位置都有一条记录 没有重复,那么您的 Events 表应该有一个使用这些 ID 之一的位置 ID - 同样,每个都有一个事件,没有重复。

然后你可以像这样加入他们;

SELECT events.event_name, locations.location_name
FROM events
JOIN locations on locations.location_id = events.location_id
于 2012-04-28T17:07:11.227 回答
0

重复是非常正常的,因为它们中的每一个都是唯一的位置。除此之外,当您尝试过滤旧金山的地点时,您认为该设计非常有用。

于 2012-04-28T17:09:24.757 回答