mysql:3つのパターン

1929 ワード

第1パターン
原子性テーブルのタプルをより小さなタプルに分割することはできません.
だいにパターン
非プライマリ・キーは、プライマリ・キーの一部だけに依存するのではなく、プライマリ・キーに完全に依存する必要があります.
例えば、米国が軍火を販売する際、武器ごとに国や地域によって価格が異なる.表を作ってみましょう.
CREATE TABLE weapon_price
(
	wp_id UNSIGNED INT NOT NULL AUTO_INCREMENT, --     
	cs_id UNSIGNED INT NOT NULL , --     id 
	wp_price UNSIGNED INT NOT NULL, --     ,             
	cs_name VARCHAR(40) NOT NULL --       ,     /   /  
);

weapon_priceは武器の価格を記述するために用いられ、価格は(武器、消費者)によって異なる.このテーブル(wp_id,cs_id)は、そのプライマリ・キーです.そのうちwp_priceは(wp_id,cs_id)に完全に依存し、cs_nameはcs_にのみ依存するid、すなわち、プライマリ・キーの一部にのみ依存する.
このような状況による問題は何ですか.
  • 増加:冗長性をもたらします.cs_nameが繰り返され、多くの武器の買い手が台湾であればcs_nameはこの表に何度も登場し、無駄になります.
  • 削除:
  • なし
  • 変更:「フィリピン」が後に改名された場合、データベース管理者はテーブル内のすべての関連csを変更しなければなりません.nameは全部直します.
  • 調べ:
  • なし
    どのように対応しますか?
    cs_をnameは別の表に移動して、もともと、データベースを学んだことがある人はすべて知っていて、1つのconsumer表を建てることができて、その中に(cs_id、cs_name)の2つのメタグループが含まれています.
    だいさんパターン
    第2のパターンを満たし、各メタグループはプライマリ・キー列に依存することを伝達しない.
    CREATE TABLE province
    (
        pr_id UNSIGNED INT NOT NULL AUTO_INCREMENT, --   
        pr_name VARCHAR(20) NOT NULL, --    ,        , pr_id   , pr_name    
        PRIMARY KEY(pr_id)
    );
    CREATE TABLE city
    (
        ct_id UNSIGNED INT NOT NULL AUTO_INCREMENT, --    
        ct_name VARCHAR(20) NOT NULL, --        ,ct_id   ,ct_name    
        pr_id UNSIGNED INT NOT NULL , --        ,ct_id   ,      pr_id
        pr_name VARCHAR(20) NOT NULL, --        ,ct_id   ,      pr_name
        PRIMARY KEY(ct_id),
        FOREIGN KEY(pr_id) REFERENCES province(pr_id) ON DELETE CASCADE
    );

    上記の2枚の表はいずれも第2のパターンを満たしているがcity表のpr_nameメタグループはct_に完全に依存するがidですがpr_を通りますid伝達はct_に依存するidの.
    依存を伝えるデメリット:
  • 増:明らかpr_nameに冗長性が現れます.
  • 削除:
  • なし
  • 改:provinceテーブルのprを変更するnameメタグループ、cityテーブルのpr_も同時に変更name .うっかりすると問題が発生する.
  • 調べ:
  • なし
    締めくくり
    普段はふざけてもパターンが使えないようですが、デザインされた表はいつも自然にパターンの要求を満たしているからです.でも、お手本には、万歳を「理解」しましょう~