城市到城市距离表的优化模式

nut*_*han 5 schema rdbms foreign-key database-design primary-key

这是我的第一个问题,如果这个问题很简单,请原谅我。我被困在这里,试图实现下面表示的数据的关系。我想垂直缩放它(新行),而不是水平添加新列作为城市名称(新列)。

到目前为止,我只能推断出两个表:

  1. 带有主键的城市表。(6 行)
  2. 带主键的距离表。(13 行)

我将如何关联这两个表?或者我应该按照下面的表示方式处理一张桌子?

桌子

Mik*_*ll' 7

大多数数据库管理系统对允许使用的列数、一行中的字节数或两者都有硬性限制。因此,您的单个表在一般情况下不起作用,因为您最终会得到太多列或一行中的太多字节。

要了解您的平台有哪些限制,请使用 Google 之类的方法

  • SQL Server 限制
  • PostgreSQL 限制
  • Oracle 限制

所有你需要存储你的数据是距离的一个表。城市表可用于验证距离表中的值,但这不是必需的。(不过我会用一个。)

但这在一般情况下也不起作用,因为它与基表受到相同的限制。要了解它如何处理相对较小的数据集,请查看此示例。并仔细查看 CHECK() 约束。

create table distances (
  city_from varchar(25) not null,
  city_to varchar(25) not null,
  check (city_from < city_to),
  distance integer not null check (distance >= 0),
  primary key (city_from, city_to)
);

insert into distances values
('Bangalore', 'Chennai', 100),
('Bangalore', 'Hyderabad', 200),
('Bangalore', 'Mumbai', 300),
('Bangalore', 'Delhi', 400),
('Bangalore', 'Kolkata', 500),
('Chennai', 'Hyderabad', 150),
('Chennai', 'Mumbai', 250),
('Chennai', 'Delhi', 450),
('Chennai', 'Kolkata', 550);
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 SELECT 语句创建数据透视表。(SQL Server。其他 dbms 有不同的处理数据透视表的方法。)

SELECT *
FROM (
  SELECT city_from, city_to, distance
  FROM distances
  union all 
  SELECT city_to, city_from, distance
  FROM distances
) AS t1
PIVOT
(
  max(distance)
  FOR [city_to]
  IN (
    [Bangalore], [Chennai], [Delhi], [Hyderabad], [Kolkata], [Mumbai]
  )
) AS t2
ORDER BY city_from;
Run Code Online (Sandbox Code Playgroud)

由于列数和每行字节数的限制,我认为您最好将基表(有或没有您在上面查询中看到的 UNION ALL)返回到应用程序,并让应用程序将其格式化以进行显示。应用程序代码通常对列数或字节数没有限制。