代码之家  ›  专栏  ›  技术社区  ›  De Wet van As

SQL-我可以有一个引用多个表之一的列吗?

  •  0
  • De Wet van As  · 技术社区  · 2 年前

    我想使用一个表来存储各种实体的联系信息。

    联系人表示例:

    enter image description here

    OwnerId应引用用户(ID)或学生(ID),如下所示:

    enter image description here

    是否可以在OwnerId列上创建多个外键约束?我正在使用EF Core,希望包含每个实体的联系信息,而不是创建单独的查询来获取联系人,例如:

    int userId = 1;
    
    var users = _databaseContext.Users.Include(x => x.Contacts).Where(x => x.Id == userId).FirstOrDefault();
    // same with Students
    

    而不是:

    int userId = 1;
    
    var user = _databaseContext.Users.Where(x => x.Id == userId).FirstOrDefault();
    var userContacts = _databaseContacts.Contacts.Where(x => x.OwnerId == userId).ToList();
    user.Contacts = userContacts;
    // same with Students
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   Richard Barraclough    2 年前

    因此:

    • 每个人都是联系人。
    • 有些联系人是用户,有些不是。
    • 有些联系人是学生,有些不是。
    • 有些联系人是老师,有些不是。

    你可以做这种事。

    CREATE TABLE ContactType (
        ContactType varchar(8) NOT NULL,
        CONSTRAINT ContactType_PK PRIMARY KEY CLUSTERED (ContactType)
    )
    
    INSERT INTO ContactType (ContactType)
    VALUES
        ('Student'),
        ('Teacher')
    
    CREATE TABLE Contact (
        ContactId   uniqueidentifier NOT NULL DEFAULT(NEWSEQUENTIALID()),
        ContactType varchar(8)       NOT NULL,
    
        CONSTRAINT Contact_PK             PRIMARY KEY CLUSTERED (ContactId),
        CONSTRAINT User_UQ                UNIQUE (ContactId, ContactType), -- To allow FK that enforces type from Student, Teacher, etc. tables.
        CONSTRAINT Contact_FK_ContactType FOREIGN KEY (ContactType) REFERENCES ContactType (ContactType)
    )
    
    CREATE TABLE [User] (
        ContactId uniqueidentifier          NOT NULL,
        Username  varchar(32)  NOT NULL,
    
        CONSTRAINT User_PK          PRIMARY KEY CLUSTERED (ContactId),
        CONSTRAINT User_UQ_Username UNIQUE (Username),
        CONSTRAINT User_FK_Contact  FOREIGN KEY (ContactId) REFERENCES Contact (ContactId)
    )
    
    CREATE TABLE Student (
        ContactId   uniqueidentifier NOT NULL,
        ContactType AS CAST('Student' AS varchar(8)),
    
        CONSTRAINT Student_PK         PRIMARY KEY CLUSTERED (ContactId),
        CONSTRAINT Student_FK_Contact FOREIGN KEY (ContactId, ContactType) REFERENCES Contact (ContactId, ContactType)
    )
    
    CREATE TABLE Teacher (
        ContactId   uniqueidentifier NOT NULL,
        ContactType AS CAST('Teacher' AS varchar(8)),
    
        CONSTRAINT Teacher_PK         PRIMARY KEY CLUSTERED (ContactId),
        CONSTRAINT Teacher_FK_Contact FOREIGN KEY (ContactId, ContactType) REFERENCES Contact (ContactId, ContactType)
    )
    
    
        2
  •  0
  •   De Wet van As    2 年前

    我在梦中得到了答案: https://entityframework.net/joining

    使用EF JOIN根据所有者ID和所述实体的主键获取每个实体的联系人。