2012-11-25 23 views
5

Cài đặtKhóa ngoài có thể thay đổi một tên trường không? Liên hệ FK để STI lớp con

Vì vậy, đây là một kịch bản mà tôi đang tìm kiếm là khá phổ biến khi bạn quyết định chơi với STI (Single Bảng Inheritance).

Bạn có một số loại cơ sở với các loại phụ khác nhau.

  • Person < (Giáo viên, Sinh viên, nhân viên, vv)
  • tài < (Thành viên, Admin)
  • Member < (người mua, người bán)
  • xe < (xe, thuyền, máy bay)
  • v.v.

Có hai phương pháp chính để lập mô hình trong cơ sở dữ liệu:

  • Độc Bảng Inheritance
    • Một bảng lớn với một lĩnh vực loại và một loạt các lĩnh vực nullable
  • Lớp Bảng Inheritance
    • Một bảng cho mỗi loại với chia sẻ PK (FK'd từ trẻ em đến cha mẹ)

Trong khi có một số vấn đề với STI, tôi làm như cách quản lý để cắt giảm số lượng kết nối bạn phải thực hiện, cũng như một số hỗ trợ trong các khung như Rails, nhưng tôi đang gặp sự cố cách liên kết các bảng phân lớp cụ thể.

Ví dụ:

  • Chứng chỉ nên tham khảo của giáo viên-Người
  • Profiles chỉ nên tham khảo Thành viên-người
  • WingInformation nên không thể liên quan đến một chiếc xe hoặc thuyền (trừ khi bạn là Batman có lẽ)
  • Quảng cáo thuộc sở hữu của Người bán-Thành viên không phải là Người mua-Thành viên

Với C TI, những mối quan hệ này là tầm thường - chỉ cần tát một Khóa Ngoại trên bàn liên quan và bạn đã hoàn thành:

ALTER TABLE advertisements 
ADD FOREIGN KEY (seller_id) REFERENCES sellers (id) 

Nhưng với STI, điều tương tự sẽ không bắt giữ giới hạn loại phụ.

ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id) REFERENCES members (id) 

Những gì tôi muốn thấy là một cái gì đó như:

* Does not work in most (all?) databases * 
ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type) 

Tất cả tôi đã có thể tìm thấy là một bẩn hack đòi hỏi thêm một cột tính vào bảng liên quan:

ALTER TABLE advertisements 
    ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller' 
ALTER TABLE advertisements 
    FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type) 

Điều này khiến tôi trở nên kỳ quặc (chưa kể đến sự không thích hợp).

Các câu hỏi thực

Có một RDBMS ra khỏi đó mà sẽ cho phép tôi làm điều này?

Có lý do nào khiến điều này không thể thực hiện được?

Đây có phải là một trong nhiều lý do tại sao KHÔNG sử dụng STI ngoại trừ trong tầm thường nhất trường hợp?

Trả lời

3

Không có cách tiêu chuẩn nào để khai báo hằng số trong khai báo khóa ngoài. Bạn phải đặt tên cột.

Nhưng bạn có thể buộc các cột phải có một giá trị cố định, bằng một trong những phương pháp sau đây:

  • Tính toán cột

  • KIỂM TRA chế

  • kích hoạt trước khi INSERT/UPDATE để ghi đè mọi giá trị do người dùng cung cấp với giá trị mặc định.

+0

Thanks @Bill và yeah, tôi đã thấy đề xuất của cột được tính toán hoặc kiểm tra trước (vì không có tiêu chuẩn cho những gì tôi muốn). Bạn có biết về bất kỳ công cụ nào cho phép cú pháp tôi đã đề cập (ngay cả trong một số cách không chuẩn). –

+0

Xin lỗi, tôi không biết gì cả. –

Các vấn đề liên quan