【问题标题】:Design a database table using this data使用这些数据设计一个数据库表
【发布时间】:2014-06-11 13:13:50
【问题描述】:

您好,我只想将这些字段整理到一个表格中。但我遇到了麻烦。

我有城市的详细信息。

这些是主要城市详细信息示例。

CityName CityID 
Colombo   001
Kandy     002

康提与这些城市直接相连

 CityName    CityID DistancefromKandy
 Katugastota 006    1km 
 Peadeniya   008    2km

我想存储每个城市之间的距离。例如,Katugastota 到 Peradeniya,Colombo 到 Katugastota,Colombo 到 Kandy 和 Kandy To Peradeniya。 对于单个城市,我想存储直接连接的城市以及到这些城市的距离。 如何将这些数据排序到表格中..?任何想法..我已经给出了我尝试过的表格结构,但我无法添加每个城市之间的距离以及直连城市和直连城市之间的距离.. 感谢这方面的任何帮助.. 我只是不需要 sql,如果有人可以建议一个更好的表格设计,那将是一个很大的帮助。

【问题讨论】:

  • 为什么不存储地理坐标(Lat/Lang)并计算出距离?
  • @EvilEpidemic 应用程序很简单,依赖于原始数据。无法包含坐标和计算距离。

标签: sql database database-design datatable normalization


【解决方案1】:

就像上面建议的 @EvilEpidemic 一样,我的第一选择是存储每个城市的坐标(纬度和经度)并计算它们之间的距离。

也就是说,如果您需要存储特定城市对的预先计算的距离,那么您可能需要尝试以下方法:

添加一个包含两 (2) 个 CityID 列(例如,SourceCityIdDestinationCityId)以及一个 NOT NULL 距离列(数字数据类型)的表。

例如,在 SQL Server 中,您可能有一个类似的表(这个过于简单的示例假设您将距离存储为 int 公里,但可以根据需要随意更改数据类型):

CREATE TABLE Distances (
    [SourceCityId] NOT NULL int,
    [DestinationCityId] NOT NULL int,
    [DistanceInKilometers] NOT NULL int,
    CONSTRAINT [PK_Distances] PRIMARY KEY CLUSTERED (
        [SourceCityId] ASC,
        [DestinationCityId] ASC
    )
)

【讨论】:

  • 直连城市如何存储?
  • Distances 表(如上所述)包括两个直连城市(即SourceCityIdDestinationCityId)的主键以及它们之间的距离。因此,例如,显示 Kandy 和 Katugastota 之间连接的表格行将在表格中显示为:SourceCityId=002、DestinationCityId=006 和 DistanceInKilometers=1。
  • +1,但有一点点挑剔:SourceCityIdDestinationCityId 应该引用(通过外键)城市表 - 您可能已经知道但忘记在答案中说明。
  • 另外,数据库应该“保护”自己免受同一对被表示两次。例如,如果存在 {Colombo, Kandy, 100km},则数据库应该不允许允许:{Kandy, Colombo, 101km}。此外,{Colombo, Colombo, ...} 不应该被允许(我们知道它总是 0 公里)。这可以通过一个简单的方式来实现:CHECK (SourceCityId < DestinationCityId)
  • @BrankoDimitrijevic:是的,当然,我完全同意。为了完成这项工作,需要外键和其他防止重复的方法。但是,在不知道原始发布者的数据库架构的所有细节的情况下,我将其留给原始发布者来解决。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多