2016-11-09 3 views
0

私はリレーショナルデータベースを扱うのが初めてで、テーブルを照会して結合する方法をよく理解しています。今日の私の質問は、2部の質問のビットです。なぜなら、それ以外の言い方を本当に分からないからです。外部キーを使用する場合、常に参加する必要がありますか?

  1. 一般に、多くの列を含む表を「グループ化されたデータ」の複数の表に分割することをお勧めします。クエリーポイントからは、特定のデータが必要ないときに時間を節約し、さらに読みやすくします。
  2. たとえば、通常は、次のすべての列を1つの表に結合し、少数の列を使用していてもすべてのデータを照会します。私は現在、次のデータベース構造を試しています。テーブルはすべてuid列を介してリンクされます。 :

    アップロード

    • ID
    • タイトル
    • 説明
    • メール
    • UID

    uploads_exif(UIDが、すべてが任意である)

    • ID
    • 開口
    • イソ
    • カメラ
    • UID
    をshutter_speed

    uploads_social(UIDしかし、すべてがオプションである)

    • ID
    • ログインfacebook
    • さえずり
    • Instagramの
    • flickrの
    • URL
    • UID

      <オールスターt = "2">
    • 上記の構造に従うと、すべてのデータを照会するためにSQL JOINSを使用する必要があります。または、単純にすべてのテーブルを照会する方法があります。たとえば、アップロード、uploads_exif、uploads_socialを1つのクエリで取得する必要がある場合は、別の関数を使用してJOINを使用せずにすべてのクエリを単純に呼び出すことも、正しい方法でJOINを使用してこれを行うこともできます。

すべてのヘルプは大幅にappriciatedされるだろう、ありがとう!

+0

まず、テーブルが単一であり、そこに格納されているすべてのデータが一貫性がある場合は、テーブルを複数のテーブルに分割することはお勧めできません。あなたが照会したい列に名前を付けるだけでいいです。第二に、あなたは多くの助けになる通常のフォームについて読むべきです。第三に、結合なしで照会する方法はたくさんありますが、結合がパフォーマンスのほうが優れていると考えられます。 – Nambu14

+0

「それはよいアイデアではありません」とはどういう意味ですか? –

+0

データがほぼ同じものであり、それが強く関連している場合、同じテーブルにあることがあります – Nambu14

答えて

1

あり、多くの回答を使用して1人の従業員がちょうど分離エンティティaddressを追加し、複数のアドレスを持っているとemployeeに割り当てることができる方法を作成します「列のグループ化」あなたの質問は2つのケースを指摘しています。私は、彼らが有益だと思う:

uploads_exif -

  • 1:1メインテーブル(uploads)で。したがって、最初の傾きは「分割しない」と言いますが、...
  • 多くの画像にはexifがなく、exifはかさばり、すべてのクエリには必要ないので、となりますそれを別のテーブルに分割してください。
  • が一意であるので、idを取り除くと、PRIMARY KEYになります。 (これは、JOINをより効率的になります。)

uploads_social -

  • 1:1をメインテーブル(uploads)と。だから、最初の傾きは「分割しないでください」と言うことですが、...
  • これは本当に物事の「配列」です。列間に配列を広げないでください。
  • 列が真偽フラグである場合は、SETを使用することを検討してください。 (そして、メインテーブルに置きます。)
  • 列がURLの(または類似のもの)している場合は、1を実行します。多くの(ソートの):

    CREATE TABLE uploads_social (
        uid ..., 
        which ENUM('facebook', 'twitter', ...), 
        url ..., 
        PRIMARY KEY(uid, which) 
    ) ENGINE=InnoDB; 
    

    (へ

変更を脇に)正規化するとき、過度の正規化はしないでください。日付、浮動小数点数、またはその他の「連続」値を正規化しないでください。

iduidの両方がuploadsにあるのはなぜですか? おそらくを取り除き、uidPRIMARY KEYに昇格させてください。

+0

ありがとう、これは実際には他の回答よりもはるかに役立ちます。 –

2

まず、Third Normal Formを調べてみるべきです。

カラム数が重要な要素ではなく、重要なのは繰り返しを避けてメンテナンスが容易になるようにすることです。あなたがテーブル

employee: [id, first_name, last_name] 

を持っている場合

は、例えば、あなたは文句を言わない二つの表に、[OK]これは極端ですが、あなたのアイデアを得ること、それを分割する必要があります。

employee_first: [id, first_name] 
employee_last: [id, last_name] 

その他のケースでは、繰り返しデータは避けられます。

フィールドがfavorite_fruitの場合、テキストフィールドを使用する代わりに、fkテーブルを作成して整数を保存します。

favorite_fruit  favorite_fruit  id fruit 
    orange     1     1 orange     
    orange     1     2 apple 
    apple   ==>  2     3 pineapple 
    pineapple    3 

保存スペース、あなたがorange juiceorageを変更したい場合にのみ1を交換する必要があるたとえば、編集することは容易です。

何あなたのケースですが、uploadの異なる種類を持っている場合たとえば、あなたがtype_idでマスターテーブルuploadを持つことができ、各タイプの詳細は、分離のテーブルを持つことができわかりません。

UPLOAD    |  table: [UPLOAD TYPE1]      
upload_id type_id  | upload_id [fields unique for type1] 
    xxxx  1  ==> | xxxxx ooooooo     
    yyyy  2   |===================================== 
         |  table: [UPLOAD TYPE2] 
         | upload_id [fields unique for type2] 
         | yyyyy  oooooooo 

もう1つの例は従業員アドレスです。 building, street, zip codeのために複数のフィールドを追加する

isteadあなたは3つのテーブル

employee: employee_id 
    adress: address_id, building, street, zip code 
    employee_adress: employee_id, adress_id. 

employee_adress

+0

本当に私のアプリケーションでは、何も変わることはないと思われます。すべてのユーザー生成コンテンツです。一般的な考え方は、パフォーマンスを向上させるために使用されるのではなく、複数の行に対してコンテンツを更新できるときに正規化を使用することです。 –

+0

あなたはそれを必要としないようですが、再び第3正規形を勉強してください。私は他の例を追加します。 –

+0

私は正規化と結合を学習しているので、これを試してみるのがいいでしょうか?私のアプリケーションに悪影響はありますか? –

関連する問題