关于交叉口的数据库设计

时间:2010-10-29 07:41:53

标签: mysql join database-design views

这两个十字路口数据库的设计

#Street
street_id | street_nm
#Crossing
crossing_id | x | y | street_id_1 | street_id_2

VS

#Street
street_id | street_nm
#Crossing
crossing_id | x | y 
#street crossing relationship
street_id | crossing_id

假设每个十字路口只有两条道路,那么为什么人们会使用第一个解决方案而不是第一个?

编辑:对于第二个设置,我如何创建一个结果如下所示的视图

crossing_id| x | y | street_nm_1 | street_nm_1

此外,我不确定如何创建具有三条道路的交叉点会影响视图。

2 个答案:

答案 0 :(得分:2)

我更喜欢第二种。

首先,“假设每个过境点只有两条道路”是非常危险的。一般来说,在设计时我宁愿不依赖与现实相冲突的假设,因为迟早你的设计必须适应“额外的情况”。

但第二种设计更好的另一个原因......假设你想要设计一个返回道路“X”(我认为这是一个非常常见的要求)的道路的查询,你的第一个设计迫使你去测试对于road_id_1 street_id_2中的道路“X”ID - 通常情况下,查询会更复杂,因为无论何时您在寻找某条道路,您都不知道它是否会列在id_1或ID_2。

关系“x穿过y”应该是对称的(除非你想区分“主要道路”和“支流”,这似乎不是这里的情况)所以第二种设计更接近意图。 / p>


关于你关于视图的问题......怎么样:

Select a.cross_id,a.x,a.y,b.street_nm,c.street_nm 
from crossing a, crossing_rel e, street b, street c 
where b.street_id=e.street_id and
      c.street_id=e.street_id and
      a.crossing_id=e.crossing_id and
      b.street <> c.street 

请注意,这不会给出任何特定的顺序,哪条街道显示为“x”,哪条街道显示为“y”...也许您会喜欢以下内容:

Select a.cross_id,a.x,a.y,b.street_nm,c.street_nm 
from crossing a, crossing_rel e, street b, street c 
where b.street_id=e.street_id and
      c.street_id=e.street_id and
      a.crossing_id=e.crossing_id and
      b.street_nm < c.street_nm 

答案 1 :(得分:1)

第二种解决方案可以更灵活地添加到交叉路口或街道,同时保持它们之间的关系在适当的环境中。这是一个微妙的区别,但值得一提。