簡體   English   中英

在 MS SQL 服務器中針對復合鍵創建外鍵

[英]Creating a foreign key against a composite key in MS SQL Server

我正在嘗試在兩個表之間創建一個外鍵。 問題是其中一個表有一個復合主鍵..

我的表是產品(每個產品一行)和 product_price_history(每個產品多行)。 我在 product_price_history 中有一個復合鍵,它是產品 ID 和該產品特定價格的開始日期。

這是我的代碼:

CREATE TABLE products (
    product_id INT IDENTITY(1,1) PRIMARY KEY,
    product_name VARCHAR(50) NOT NULL,
    product_desc VARCHAR(255) NULL,
    product_group_id INT
)
CREATE TABLE product_price_history (
    product_id INT NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NULL,
    price NUMERIC (6,2) NOT NULL
)
ALTER TABLE product_price_history
    ADD CONSTRAINT pk_product_id_start_dt
    PRIMARY KEY (product_id,start_date)

現在我正在嘗試在 products 表和 product_price_history 表之間創建一個外鍵,但我不能,因為它是一個復合鍵。

此外,將開始日期(外鍵的另一部分)添加到產品表中也沒有任何意義。

處理這個問題的最佳方法是什么? 我可以在這些表之間創建外鍵嗎? 我什至需要外鍵嗎?

我的意圖是

  1. 強制產品價格信息的唯一性。 一個產品在任何時候都只能有一個價格。
  2. 鏈接這兩個表,以便它們之間存在邏輯連接,我可以在數據庫圖中顯示它

product_price_history表上的外鍵應該只包含product_id 您的目標是確保任何條目product_price_historyproducts中已經有“父”條目。 這與start_date無關。

我看到這種情況的方式,理論上,表的完全規范化版本必須將current_price作為products表中的唯一值。 product_price_history只是一個日志表。

沒有必要以這種方式使用物理字段,但從這個角度思考有助於了解您的表 model 在哪里稍微去規范化。

此外,如果您制作product_price_history表而不是簡單的日志表,您如何確保新的start_date比以前的end_date更新? 您甚至不能將其表示為主鍵。 如果您稍后編輯start_date會怎樣? 我什至會考慮為product_price_history表創建不同的復合鍵。 也許product_id + insert_date或僅自動遞增id ,同時仍保持與products.product_id的外鍵關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM