Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khóa ngoại cho nhiều bảng

Bạn có một vài lựa chọn, tất cả đều khác nhau về độ "đúng" và dễ sử dụng. Như mọi khi, thiết kế phù hợp tùy thuộc vào nhu cầu của bạn.

  • Bạn có thể chỉ cần tạo hai cột trong Ticket, OwnedByUserId và OwnedByGroupId, và có các Khóa ngoại có thể vô hiệu cho mỗi bảng.

  • Bạn có thể tạo bảng tham chiếu M:M cho phép cả quan hệ vé:người dùng và vé:nhóm. Có lẽ trong tương lai bạn sẽ muốn cho phép một vé duy nhất được sở hữu bởi nhiều người dùng hoặc nhóm? Thiết kế này không bắt buộc rằng thẻ phải chỉ được sở hữu bởi một tổ chức duy nhất.

  • Bạn có thể tạo một nhóm mặc định cho mọi người dùng và có vé chỉ thuộc sở hữu của Nhóm thực sự hoặc Nhóm mặc định của người dùng.

  • Hoặc (lựa chọn của tôi) lập mô hình một thực thể hoạt động như một cơ sở cho cả Người dùng và Nhóm, đồng thời có các vé thuộc sở hữu của thực thể đó.

Đây là một ví dụ sơ bộ bằng cách sử dụng lược đồ đã đăng của bạn:

create table dbo.PartyType
(   
    PartyTypeId tinyint primary key,
    PartyTypeName varchar(10)
)

insert into dbo.PartyType
    values(1, 'User'), (2, 'Group');


create table dbo.Party
(
    PartyId int identity(1,1) primary key,
    PartyTypeId tinyint references dbo.PartyType(PartyTypeId),
    unique (PartyId, PartyTypeId)
)

CREATE TABLE dbo.[Group]
(
    ID int primary key,
    Name varchar(50) NOT NULL,
    PartyTypeId as cast(2 as tinyint) persisted,
    foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID)
)  

CREATE TABLE dbo.[User]
(
    ID int primary key,
    Name varchar(50) NOT NULL,
    PartyTypeId as cast(1 as tinyint) persisted,
    foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID)
)

CREATE TABLE dbo.Ticket
(
    ID int primary key,
    [Owner] int NOT NULL references dbo.Party(PartyId),
    [Subject] varchar(50) NULL
)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lưu trữ mật khẩu trong cơ sở dữ liệu một cách an toàn?

  2. Lưu trữ các kiểu dữ liệu nhị phân trong SQL Server

  3. T-SQL có hàm tổng hợp để nối các chuỗi không?

  4. Tính số bản ghi cho mỗi ngày giữa 2 ngày

  5. Chọn nhóm hàng phù hợp với tất cả các mục trong danh sách