Inheritance

數據庫關係繼承

  • August 22, 2017

我有一家汽車銷售店。在我的商店中,我銷售多種車輛,例如汽車和船隻。我想跟踪銷售情況。

我的車輛有一些屬性:

  • 在(某天)到達商店
  • 品牌
  • 模型
  • 顏色
  • 類型(是汽車還是船)

船還有一些其他特殊屬性:

  • 登記處
  • 容量
  • 腳部空間

汽車還有其他屬性:

  • 登記處
  • 座位

我的訂單有以下屬性

  • 車輛(應該與一些相關的車輛相關
  • 契約日期
  • 價值
  • 買家 ID 號(是的可以為買家數據添加資料結構)。

我從來沒有兩輛相同的車輛,因為每輛車都與另一輛車完全不同(即使它是相同的品牌/顏色/型號),我不賣餅乾。

我如何在 SQL 關係數據庫中表示它?

訂單如何表達?

特別是我試圖了解這在 SQLAlchemy 中是如何工作的。

您的問題通常過於寬泛,無法在此處發表,但我會畫出一些可能有助於您入門的內容。

車輛可以是船,也可以是汽車。一個好的起點是考慮什麼可以辨識車輛?由於我不了解您的業務,因此我假設存在某種車輛 ID,請注意,這可以是屬性的組合:

CREATE TABLE VEHICLE
( VEHICLE_ID ... NOT NULL
, other attributes such as brand
, VEHICLE_TYPE CHAR(4) NOT NULL
,     PRIMARY KEY (VEHICLE_ID)
,     CHECK (VEHICLE_TYPE IN ('CAR','BOAT')
);

如果你想鍵入安全的子類型(防止有人在 car 表中添加船),你可以在 vehicle 表中添加一個超級鍵:

CREATE TABLE VEHICLE
( VEHICLE_ID ... NOT NULL
, other attributes such as brand
, VEHICLE_TYPE CHAR(4) NOT NULL
,     PRIMARY KEY (VEHICLE_ID)
,     CHECK (VEHICLE_TYPE IN ('CAR','BOAT')
     UNIQUE (VEHICLE_TYPE, VEHICLE_ID)
);

一艘船可以表示為:

CREATE TABLE BOAT
( VEHICLE_ID ... NOT NULL
, other attributes such as registry
, VEHICLE_TYPE CHAR(4) NOT NULL
,     PRIMARY KEY (VEHICLE_ID)
,     CHECK (VEHICLE_TYPE = 'BOAT')
     FOREIGN KEY (VEHICLE_TYPE, VEHICLE_ID)
         REFERENCES VEHICLE (VEHICLE_TYPE, VEHICLE_ID)
);

和一個類似的汽車:

CREATE TABLE CAR
( VEHICLE_ID ... NOT NULL
, other attributes such as seats
, VEHICLE_TYPE CHAR(4) NOT NULL
,     PRIMARY KEY (VEHICLE_ID)
,     CHECK (VEHICLE_TYPE = 'CAR')
     FOREIGN KEY (VEHICLE_TYPE, VEHICLE_ID)
         REFERENCES VEHICLE (VEHICLE_TYPE, VEHICLE_ID)
);

由於系統資料庫是汽車和船的屬性,您可能會考慮將該屬性添加到車輛。

訂單可以表示為(我假設這是一個可用於辨識訂單的 order_id):

CREATE TABLE ORDER
( ORDER_ID ... NOT NULL PRIMARY KEY 
, VEHICLE_ID ... NOT NULL
     REFERENCES VEHICLE (VEHICLE_ID)
, BUYER_ID ... NOT NULL
     REFERENCES BUYERS (BUYER_ID) 
, other attributes such as date_of_contract
);

這只是一個粗略的草圖,可能充滿了錯誤的假設。我將從確定所涉及的表開始。完成後,開始考慮是什麼標識了每個表中的一行。

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