sql >> データベース >  >> RDS >> Mysql

複数でありながら相互に排他的な外部キー-これは進むべき道ですか?

    ここでモデルを調べると、次のことがわかります。

    1. ユーザーは1つのウェブサイトにのみ関連しています
      • 会社は1つのウェブサイトにのみ関連しています
      • ウェブサイトは1人のユーザーまたは会社にのみ関連しています

    3番目の関係は、PRIMARY KEYを持つ「ユーザーまたは会社」エンティティの存在を意味します。 どこかに保存する必要があります。

    それを保存するには、PRIMARY KEYを保存するテーブルを作成する必要があります website ownerの 実在物。このテーブルには、ユーザーとWebサイトに共通の属性を格納することもできます。

    これは1対1の関係であるため、Webサイトの属性もこのテーブルに格納できます。

    ユーザーや企業が共有していない属性は、別のテーブルに保存する必要があります。

    正しい関係を強制するには、PRIMARY KEYを作成する必要があります websiteowner typeとの複合 その一部として、CHECKを使用して子テーブルに正しい型を強制します 制約:

    CREATE TABLE website_owner (
        type INT NOT NULL,
        id INT NOT NULL,
        website_attributes,
        common_attributes,
        CHECK (type IN (1, 2)) -- 1 for user, 2 for company
        PRIMARY KEY (type, id)
    )
    
    CREATE TABLE user (
        type INT NOT NULL,
        id INT NOT NULL PRIMARY KEY,
        user_attributes,
        CHECK (type = 1),
        FOREIGN KEY (type, id) REFERENCES website_owner
    )
    
    CREATE TABLE company (
        type INT NOT NULL,
        id INT NOT NULL PRIMARY KEY,
        company_attributes,
        CHECK (type = 2),
        FOREIGN KEY (type, id) REFERENCES website_owner
    )
    


    1. MySQLでピボットテーブルを作成する方法

    2. MySQLでのテーブルエンジンの変更

    3. パフォーマンスチューニング迷路

    4. SHOWTABLESクエリを制限する方法