Database-Design

城市間距離表的優化架構

  • May 25, 2018

這是我的第一個問題,如果這個問題很簡單,請原諒我。我被困在這裡,試圖實現下面表示的數據的關係。我想垂直縮放它(新行),而不是水平添加新列作為城市名稱(新列)。

到目前為止,我只能推導出兩張表:

  1. 帶有主鍵的城市表。(6 行)
  2. 帶主鍵的距離表。(13 行)

我將如何關聯這兩個表?或者我應該按照下面的表示繼續使用一張表嗎?

桌子

大多數數據庫管理系統對允許使用的列數、行中的字節數或兩者都有硬性限制。因此,您的單個表在一般情況下將不起作用,因為您最終會乙太多列或太多字節結束。

要了解您的平台的限制是什麼,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);

現在您可以使用 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;

由於列數和每行字節數的限制,我認為您最好將基表(有或沒有您在上面的查詢中看到的 UNION ALL)返回到應用程序,並讓應用程序格式化它以供顯示。應用程式碼通常對列數或字節數沒有限制。

引用自:https://dba.stackexchange.com/questions/31337