数据库设计:在一个表中添加两个不同的列还是添加另一个表?

时间:2011-02-01 12:21:25

标签: database-design

我正在开发一个Web应用程序,用于在sql server数据库上存储有关车祸的数据。

我需要一种方法来存储发生事故的道路。 最初我认为在事故表中有两个不同的列(比如FirstRoad,SecondRoad)(第二个用于十字路口)。 我的一位朋友说,最好有一个不同的道路表。

我不知道哪种解决方案更好。

事故表估计每年有大约1000条记录:与另一张桌子的连接在性能方面是否昂贵?

该应用程序的一个目标是创建统计报告;其中一个是最危险的道路列表,可能在数据库中有两列可能是创建该报告的问题。你怎么看?

感谢。

更新 道路名称​​不是我需要存储的唯一信息。一个重要数据是街道号码(如果事故发生在城市内)或英里(城市外)。在这个阶段,我没有地理坐标。

如果将Accident表与这些字段一起使用?:

AccidentId(PK),Road1Id(FK),< - 指向路面表,存储所有道路名称Road2Id(FK),Road1_StreetNumber_or_Mile,Road2_StreetNumber_or_Mile等......

6 个答案:

答案 0 :(得分:1)

我个人会为所有事情分配表格,特别是对于统计分析。道路可以有名称,邮政编码,城镇等,每个都可以帮助分析。但是,如果您要存储的只是道路名称,我认为您无需拥有单独的表格。在说,每年1000条记录绝对没有。与另一个表的简单连接对性能的影响可以忽略不计。

答案 1 :(得分:0)

最好使用2个表。一个有2个ID列,每个道路一个。第二张表将包含所有道路名称。这会减少您长期输入的实际信息量,并减少使用不同名称输入道路名称2次的机会。

它还可以快速报告,因为您可以使用道路ID而不是名称求和。

这背后有一个完整的数据库理论/数学系统称为数据规范化。这个,http://en.wikipedia.org/wiki/Database_normalization是了解它的一个很好的起点。

答案 2 :(得分:0)

如果您只希望看到最多两条道路,那么我可能不会将道路标准化为单独的表格,但会在主要表格中包含Road1和Road2字段。但是,如果可能的话,您将看到超过2条道路,那么您可能需要考虑事故表(1)和道路表(许多)之间的1对多关系。

当您计划进行统计分析时,您可能会遇到问题,因为英国道路名称肯定不足以识别位置。根据您在事故地点的数据量,您可能希望扩展记录物理位置的方式,以便仅在道路名称之外进行分析。

答案 3 :(得分:0)

从今天的数据库设计标准中,您希望消除冗余。

所以单独的Road table绝对是一个很好的建议。

下一个问题是是否使用空值进行修改。空值通常更快,因为您不需要交叉连接,并且如果它们经常被填充则是可取的。

由于一次事故只能在一条或两条道路上发生,我会推荐一张带有roadA,roadB和道路路面的事故表。

答案 4 :(得分:0)

  

我不知道哪种解决方案更好。

步骤1.在做另一件事之前,先购买一本关于关系数据库设计的好书。认真。这是一个众所周知的问题,你需要更多的背景知识。

步骤2.在了解普通数据库设计之后,购买Kimball的The Data Warehouse Toolkit。

  

事故表估计每年有大约1000条记录:与另一张桌子的连接在性能方面是否会很昂贵?

这在显微镜下很小。认真。在你谈论100,000个记录之前,你真的没有一个非常大的数据库。

  

该应用程序的一个目标是创建统计报告;其中一个是最危险的道路列表,可能在数据库中有两列可能是创建该报告的问题。你怎么看?

立即购买Kimball的The Data Warehouse Toolkit。

你有一个“事实”表,这是一个意外。事故可能没有可测量的数量。它变成了一个奇怪的“无事实事实表”,因为你没有与事故相关的测量结果。理想情况下,你有一个事实(如成本或其他)。

您有事故的维度:

  • 时间
  • road(实际上从事故事实到这个维度的两个参考)
  • 车辆?
  • 事故类型(仅财产损失,伤害,死亡)
  • 原因(驱动程序错误,机械问题等)

每个维度都是一个单独的表,中央事实表也是如此。

答案 5 :(得分:0)

也许你可以从这样的事情开始 - 只是为了给你一个想法。

enter image description here