Bar*_*xto 4 schema database-design
假设我正在使用 SQL 平台并希望实现基数一对零或一(1-0..1) 的关系。这种情况与业务环境有关,我们可以说:
product可以有零或一price。所以:
场景一:
CREATE TABLE product
(
product_id INT NOT NULL,
name CHAR(30) NULL,
product_price_id INT NULL,
CONSTRAINT PK_product PRIMARY KEY (product_id),
CONSTRAINT UQ_product_price UNIQUE (product_price_id)
);
CREATE TABLE product_price
(
product_price_id INT NOT NULL,
price DECIMAL NOT NULL,
tax_rate DECIMAL NOT NULL,
currency_id INT NOT NULL,
CONSTRAINT PK_product_price PRIMARY KEY (product_price_id),
CONSTRAINT FK_product_price_to_product FOREIGN KEY (product_price_id)
REFERENCES product (product_id)
);
Run Code Online (Sandbox Code Playgroud)
场景2:
CREATE TABLE product
(
product_id INT NOT NULL,
name CHAR(30) NULL,
CONSTRAINT PK_product PRIMARY KEY (product_id)
);
CREATE TABLE product_price
(
product_id INT NOT NULL, -- Assume that this column might be set as PRIMARY KEY or UNIQUE.
price DECIMAL NOT NULL,
tax_rate DECIMAL NOT NULL,
currency_id INT NOT NULL,
CONSTRAINT PK_product_price PRIMARY KEY (product_id),
CONSTRAINT FK_product_price_to_product FOREIGN KEY (product_id)
REFERENCES product (product_id)
);
Run Code Online (Sandbox Code Playgroud)
场景 1 可以将多个产品链接到同一个 product_price。第二种情况,其中表具有相同的 PK(其中一个是 FK),被迫为 1 到 {0,1}。
编辑:好吧,既然你已经改变了 Scenario1,我的答案就不再合适了。现在,您的两个场景是相同的,但是您的第一个表有两个 PK。Scenario2 很好,可以实现你想要的。如果大多数产品都有价格,那么您也可以将它们放在一个表中,这看起来像左联接的结果,这样没有价格的产品在这些列中只有 NULL。