如何在MySQL中存储“事件”的“位置”

时间:2012-04-28 16:59:18

标签: mysql entity-relationship

我有两个实体:活动位置。关系是:

1个活动可以有 1个位置 1位置可以包含多个事件

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

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

我基本上有一个设计问题,我希望得到一些帮助:

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

location_id | Street         | Number | City          | Zip Code | State | Country
------------+----------------+--------+---------------+----------+-------+---------
          1 | Matilda Street |    356 | San Francisco |    12345 | CA    | USA
          2 | Matilda Street |    890 | San Francisco |    12345 | CA    | USA

然后您的events表可能包含:

event_id | location_id | Date       | Description
---------+-------------+------------+----------------
       1 |           1 | 2012-04-28 | Birthday party
       2 |           1 | 2012-04-29 | Hangover party
       3 |           2 | 2012-04-29 | Funeral
       4 |           1 | 2012-05-01 | May day!

在此示例中,location_idPRIMARY KEY表中的locationsFOREIGN KEY表中的events

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您的位置表应具有唯一ID,例如1 = Matilda Street,2 = Market Street - 每个可能位置的一条记录NO DUPLICATES,然后您的Events表应具有使用其中一个ID的位置ID - 再次,每个事件一个,没有重复。

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

SELECT events.event_name, locations.location_name
FROM events
JOIN locations on locations.location_id = events.location_id

答案 3 :(得分:0)

复制非常正常,因为每个复制都是一个独特的位置。除此之外,当您尝试过滤旧金山的地方时,您认为的设计非常实用。