我有两个实体:活动和位置。关系是:
1个活动可以有 1个位置。 1位置可以包含多个事件。
基本上我想存储事件。每个活动都托管在特定的位置。当我说具体位置时,我的意思是:
Street, Number, City, Zip Code, State, Country
我基本上有一个设计问题,我希望得到一些帮助:
1 - 现在我正在考虑做以下事情:
事件表将有一个location_id
,它将指向位置表中的特定位置行。这会发生什么:
我会在每一行中有很多重复的值。例如,如果事件发生在旧金山的 356 Matilda Street,另一个事件发生在旧金山的 890 Matilda Street。 Matilda Street和旧金山的值将在位置表中多次重复。如何重新设计以使其正常化?
所以,基本上我很想听到一个很好的方法来解决像MySQL这样的关系数据库这个问题。
答案 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_id
是PRIMARY KEY
表中的locations
和FOREIGN 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)
复制非常正常,因为每个复制都是一个独特的位置。除此之外,当您尝试过滤旧金山的地方时,您认为的设计非常实用。