2011-09-04 13 views
6

次の表は、異なる列命名規則を使用しています。テーブル名の接頭辞が付いているテーブルの列の名前が良いですか?

<<User>> 
id 
name 
age 

VS

<<User>> 
user_id 
user_name 
user_age 

それはAS 'で適切にエイリアスされていない場合、オーバーラップを得ることができる2つの異なるテーブルのテーブルに同じ列名を結ぶことになると私は見明確な利点があります。しかし、後者では、そのような必要はありませんが、最初の構造を使用して多くのプロジェクトを見つけることができますか?何故ですか?

答えて

0

それが唯一の答えではありませんが、これは私がDB構造を設定する方法である:

  • テーブル名は大文字でかつ複数あり:UsersDocumentsProducts
  • 列名は
  • 主キー小文字ですテーブルプレフィックスが単数で含まれています。user_iddocument_id
  • 外部キーは、参照する主キーと同じ名前です
  • ユーザーとの文書の場合、例えばので

:そのようなテーブルで

Users     Documents 
--------    ---------- 
user_id PK ----.  document_id PK 
nickname  `----- user_id FK 
hash     title 
         content 

ニックネームあなたが書くでしょう=「wintermute」とのユーザーのすべてのドキュメントのタイトルを選択する:

SELECT 
    Documents.title AS title 
FROM Documents 
    LEFT JOIN Users USING(user_id) 
WHERE nickname = 'wintermute' 
+0

SQLの標準(とほとんどのDBMS)によると、 'Documents'、' documents'、 'DOCUMENTS'は同じ識別子です。 –

+1

@a_horse_with_no_nameなので、MySQLでは(Windows上で、nixではなく)テーブル名では大文字と小文字が区別されるという事実を認識していないと思います。だから話題にタグ[タグ:mysql]があるので、それはかなり重要だと思います。 –

+0

はい(非標準)の事実を知っています。実際にはWindowsシステムではMyISAMを使用していますが、ファイルシステムが存在しないため、デフォルトでは大文字と小文字は区別されません。 Unix/Linuxでは、ファイルシステムで大文字と小文字が区別されるため、大文字と小文字が区別されます –

1

このスタイルは、ディナールが地球を支配した昔のオラクルのハッカーのものでした。 を使用しないでください。それは苦痛で醜いです。私はこの練習を強く控える。

0

最近のデータベースデザインクラスでは、私の講師が接頭辞付きの大会を奨励していました。ちょうど総体を見た。

0

私たちはあなたの最初の例と同じような慣習を、私たちのOracleボックスで使っています。私はそれを嫌いです。

私にとっては、大量に重複していると思います。 でも私は大規模なクエリではデバッグに役立つことを認めていますが、それは非常に視覚的に明らかです。

どちらが優れていますか?良い答えはありません。どちらがあなたを悪くしないようにしますか? それは唯一の真の答えです。

6

私は個人的にSELECT user.id, user.name FROM userは完全に読みやすく、理解しやすいので、私は思う

<<User>> 
    id 
    name 
    age 

を好むと思います。私はあまりにも冗長なuser.user_idから多くの利益を見ません。また、オブジェクト指向コードを記述する際に、ユーザオブジェクトのid user_idを呼び出さないので、なぜデータベース内でそれを行うのでしょうか?

A clear advantage I see is when it comes to joining tables same column name 
of two different tables can get overlap if not aliased properly with 'AS' 

私はあなたのポイントを参照しますが、アカウントテーブルはまた、我々はまだしなければならないuser_idフィールドを持っている場合は、この

SELECT user_id FROM user 
INNER JOIN account ON account.account_id = user.account_id 

最初の例では任意のより良いより

SELECT user.id FROM user 
INNER JOIN account ON account.id = user.account_id 

を書いていますプレフィックスはSELECT user_id FROM...で、SELECT user.user_id FROM...

私が見ることができる限り、2番目の例はであり、多くはです。

+0

私は同意します。しかし、私は彼が少し違うことを意味すると思う。例えば: 'select * from t1 join t2 on t1.id = t2.id'。この場合、アスタリスクは、カラム名が接頭辞でない場合、2つのあいまいなIDを返します。だからあなたのケースではエイリアスがクエリに必要です。しかし、いずれにしても、エイリアスの使用はプレフィックスを使用するよりも優れた解決策であると私は考えています。 – Karolis

+1

@Karolis 'select *'は決して良い考えではありません(物事を試したりデバッグすることを除いて) –

3

私は個人的にプレフィックスを使用しません。列ではなくテーブルではない(tblSomethingはちょっとばかげた名前です)。

ID列には例外が1つあります(常に1つありますか?ありません)。

他のすべての列名は、通常、表自体に強く関連し、接頭辞なしのSQL文で簡単に検出できますが、ID列は異なります。

だから私は自分自身がしばしばのようなものを使用して検索する:user_idは、FIRSTNAME、

+0

joinでselectで複数の 'tablename。*'を実行すると、複数の 'id'カラム(別のテーブルから)混乱しているので、プライマリキーにテーブル名を追加することをお勧めします。個人的には、 'user_id'の代わりに単に' user'を使用します。 '(users.user = comments.user)のコメントに参加する'など。 – OdraEncoded

0

複雑なシステムは、多くの場合、メタデータ・リポジトリを使用LASTNAME。メタデータリポジトリでは、データ要素が一意である必要があります。つまり、データ要素名(id)は同じですが、データ定義(ユーザーID、アカウントIDなど)が異なる147の表を使用すると機能しません。

"user_id"の "user"部分は、 "user_id"が存在するテーブルの名前ではなく、代わりに "user"がオブジェクトクラス用語であり、 "id"そのオブジェクトクラスのプロパティの1つ。私はオブジェクト,クラスおよびプロパティをOOプログラミングの意味ではなく、ISO 11179メタデータ標準の意味で使用しています。

オンラインでISO 11179の草案を見つけることができます。私はそれが読む価値があると思う。

複数の列を使用している場合は、すべての名前の「id」を1つのクエリで使用する場合は、少なくとも一部をエイリアスする必要があります。 10年または15年以上働いている40人のプログラマーが毎回同じエイリアスを使用する可能性はありますか?大規模なシステムでは、ユーザーのID番号が表示されるたびに「user_id」という名前になることを知る上で、多くの価値があります。 (私はおそらく自己結合ではありません)私は、ユーザーのID番号が "user_id"、 "usr_id"、 "u_id"、 "u_no"、 "u_uno"、 "u_n"、 "u" "uid"など。時間がかかります。よりよく使用できる時間。

関連する問題