【问题标题】:DB Design regarding intersections关于交叉口的数据库设计
【发布时间】:2010-10-29 07:41:52
【问题描述】:

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

#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

我也不确定用三条道路创建一个路口会如何影响视野。

【问题讨论】:

    标签: mysql join database-design views


    【解决方案1】:

    我更喜欢第二个。

    首先,“假设每个路口只有两条路”是非常冒险的。一般来说,在设计时,我不喜欢依赖与现实相冲突的假设,因为迟早你的设计将不得不适应“额外情况”。

    但是第二个设计更好还有另一个原因...假设您要设计一个查询来返回所有穿过道路“X”的道路(我想这将是一个非常常见的要求)您的第一个设计迫使您进行测试对于 street_id_1 street_id_2 中的道路“X” id - 通常,查询更加复杂,因为每当您寻找给定道路时,您不知道它是否会列在 id_1 中或id_2。

    “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 <> 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 
    

    【讨论】:

    • 太好了,我相信第二个选项是最好的解决方案,我只需要知道如何像第一个设计一样输出记录(请参阅我的编辑),以及该视图将如何受到影响三路交汇处
    • 要将其从 2 路推广到 3 路,您可以为第 3 个街道 ID 添加另一个连接,但使其成为外部连接(假设您同时具有 2 路和 3 路,所以第三街是“可选的”)。请注意,如果您想将其推广到 n 路,这可能会变得过于繁琐,无法将其作为 N=4 后面的视图来管理...
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多