实现一对零或一关系

Bar*_*xto 4 schema database-design

假设我正在使用 SQL 平台并希望实现基数一对零或一(1-0..1) 的关系。这种情况与业务环境有关,我们可以说:

  • Aproduct可以有零或一price

所以:

  1. 下面显示的两种场景(DDL 结构)之间有什么区别?
  2. 什么时候应该优先选择另一个?
  3. 他们中的任何一个被认为是一个糟糕的设计吗?

场景一:

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)

Rob*_*ley 5

场景 1 可以将多个产品链接到同一个 product_price。第二种情况,其中表具有相同的 PK(其中一个是 FK),被迫为 1 到 {0,1}。

编辑:好吧,既然你已经改变了 Scenario1,我的答案就不再合适了。现在,您的两个场景是相同的,但是您的第一个表有两个 PK。Scenario2 很好,可以实现你想要的。如果大多数产品都有价格,那么您也可以将它们放在一个表中,这看起来像左联接的结果,这样没有价格的产品在这些列中只有 NULL。