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

SQL複数のテーブル間の多対多の関係

    はい、そこにあるものはすべて大丈夫に見えます。しかし...

    いくつかの注意事項:

    genderには短いデータ型を使用します 桁;それを表現するのに255文字必要だとは思いません。 (適用される行の最大サイズには制限があります。)その値が少ない場合は、ENUMを検討します。 データ型。

    NOT NULLも追加する可能性があります heroname、firstname、lastnameなど、これらの列のいくつかに対する制約。 DEFAULT ''も追加する可能性があります 。場合によっては、何らかの理由で実際にNULL値を許可する必要がありますが、NOT NULLを使用します。 できる限り。

    TEXTについて躊躇しています 列。 TEXTを使用しても問題はありません データ型ですが、それらが追加の列に格納する方がよい情報を「隠している」のではないかと疑っています。

    外部キーの場合、使用するパターンに従って制約に名前を割り当て、ON UPDATE CASCADE ON DELETE CASCADEも追加する可能性があります。

    CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID) 
      REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE
    

    識別子(テーブル名と列名)に関する注意

    私たちのやり方では、すべてのテーブル名は小文字です。 。 (すべてのテーブル名を小文字に強制するMySQLオプションセットがあります。)これは、さまざまなオペレーティングシステム/ファイルシステム(大文字と小文字を区別するものとそうでないもの)の非互換性の問題を回避するために行います。

    また、テーブル名は単数 。テーブルの名前は、1行の名前です。 表のはを表します。 _tableも含まれていません 名前の一部として。

    MySQLの列名では大文字と小文字が区別されることはありませんが、列名にも常に小文字を使用します。列名を「キャメルケース」にするのではなく、アンダースコア文字を区切り文字として使用します。 power_idpowerIDhero_name vs. heroName

    フォローアップ

    上記の私の「メモ」は、従わなければならない特定の規則ではありません。これらは私たちが使用する単なるパターンです。

    これらのパターンに従うことは、ソフトウェアが成功することを保証するものではありませんが、それは私たちを助けます。

    参考までに、これらのテーブルが別のパターンの例として、当店からの「最初のカット」としてどのように見えるかを示します。これはではありません 「正しい道」、それは私たちがチームとして決めた「道」にすぎません。

    CREATE TABLE superhero
    ( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
    , hero_name        VARCHAR(255) NOT NULL                COMMENT ''
    , first_name       VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
    , last_name        VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
    , first_appearance DATE                                 COMMENT 'date superhero first appeared'
    , gender           ENUM('female','male','other')        COMMENT 'female,male or other'
    , biography_text   TEXT                                 COMMENT ''
    , universe         VARCHAR(255)                         COMMENT ''
    , PRIMARY KEY(id)
    , UNIQUE KEY superhero_UX1 (hero_name) 
    ) ENGINE=InnoDB;
    
    CREATE TABLE power
    ( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
    , name             VARCHAR(255) NOT NULL                COMMENT ''  
    , description_text TEXT NOT NULL                        COMMENT '' 
    , PRIMARY KEY(id)
    , UNIQUE KEY power_UX1 (name)
    ) ENGINE=InnoDB;
    
    CREATE TABLE superheropower
    ( superhero_id   INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref superhero'
    , power_id       INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref power'
    , PRIMARY KEY(superhero_id, power_id)
    , CONSTRAINT FK_superheropower_superhero 
         FOREIGN KEY(superhero_id) REFERENCES superhero(id)
         ON UPDATE CASCADE ON DELETE CASCADE
    , CONSTRAINT FK_superheropower_power
         FOREIGN KEY (power_id) REFERENCES power(id) 
         ON UPDATE CASCADE ON DELETE CASCADE
    ) ENGINE=InnoDB;
    


    1. docker-entrypoint-initdbのMySQLスクリプトは実行されません

    2. PostgreSQLで数値を含まない値を検索する

    3. USINGキーワードとON句-MYSQL

    4. IPv6互換アドレスをリレーショナルデータベースに保存する方法