这两个十字路口数据库的设计
#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
此外,我不确定如何创建具有三条道路的交叉点会影响视图。
答案 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)
第二种解决方案可以更灵活地添加到交叉路口或街道,同时保持它们之间的关系在适当的环境中。这是一个微妙的区别,但值得一提。