How to model exclusive relation in relational database?

Let there be 3 tables: A, B, C.
A row in A may be associated to a row in B, or it may be associated to a row in C, but it must not be associated to both B and C.
In other words, the association is an exclusive-or, one-to-one.

Here are some proposed alternatives:

  1. B holds a foreign key to A (B.A_id), C holds a foreign key to A (C.A_id). I can’t think of a way to constrain the exclusivity of the association.
  2. A holds a foreign key to B (A.B_id), and another foreign key to C (A.C_id). We can constrain the exclusivity via CHECK (A_id IS NULL AND B_id IS NOT NULL) OR (A_id IS NOT NULL AND B_id IS NULL). But we pay in width (memory & disk), because we don’t use half of the foreign key columns.
  3. A holds an unconstrained column (A.foreign_id), which may be either Bs or Cs key, and A holds another column that signifies the type (A.foreign_type = either B or C). This satisfies both the exclusivity constraint, and minimizes width, but loses foreign-key constraint validation, and makes querying complex (who I join with is predicated on the A.foreign_type column)

Which scales best? Are there pros/cons to discuss that weren’t listed? Are there any other alternatives to consider?

0

Alternative 1. The problem with this approach is that the A may contain something different from what is in B or C. If this situation is acceptable for you, then the following design (conceptually) could be a solution to your exclusivity problem:

CREATE TABLE A
(
    type SMALLINT,
    id   INTEGER,
    PRIMARY KEY (type, id)
);

CREATE TABLE B
(
    type SMALLINT,
    id   INTEGER,
    PRIMARY KEY (type, id),
    CHECK ( type = 1 ),
    FOREIGN KEY (type, id) REFERENCES A (type, id)
);

CREATE TABLE C
(
    type SMALLINT,
    id   INTEGER,
    PRIMARY KEY (type, id),
    CHECK ( type = 2 ),
    FOREIGN KEY (type, id) REFERENCES A (type, id)
);

Alternative 2. The problem with this approach is that B and C may contain something that A will not contain. If this is not a problem for you, then I would not worry about disk space at all (the best way to check this is to conduct an experiment).

Alternative 3. If you want to have constraints, consider making one table BC instead of two tables B and C.

CREATE TABLE BC
(
    type    SMALLINT,
    id      INTEGER,
    b_field INT,
    c_field INT,
    PRIMARY KEY (type, id)
);

CREATE TABLE A
(
    type SMALLINT,
    id   INTEGER,
    PRIMARY KEY (type, id),
    FOREIGN KEY (type, id) REFERENCES BC (type, id)
);

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật