2012-01-17 20 views
0

必要なとき(自己参照など)を除いて、SQLエイリアスを使用しないという欠点はありますか?それは私を悩ますSQLクエリでエイリアスを使用しないと欠点はありますか?

SELECT c.name, p.phone, a.number, ct.fbAddress 
FROM customer c 
INNER JOIN Person p ON p.idCustomer = c.idCuster 
INNER JOIN Address a ON .... etc 

は、私はしばしばのようなクエリを参照してください。それは簡単には維持できません。なぜフルネームを使用しないのですか?それに問題はありますか?

これは単なる例です。私はこの種のショートカットを使って10〜15個のテーブルを持つクエリを見てきました。それは読むことができません。

編集:私は代わりに「保守性」「それは読みやすいではありません」書かれているはずです

。 "FROM"句でのみテーブルを変更する必要がある場合は、テーブルの名前を変更するほうが簡単です。

私はこれらの "一文字のエイリアス"をDBAの大部分が見てきました。だからパフォーマンスに問題があるかもしれません。

+2

「それは簡単には維持できません。 –

+0

@MitchWheatもっとメンテナンスできるのはなぜですか? – mrmuggles

+0

も参照してください:http://stackoverflow.com/questions/8363108/how-does-table-alias-names-affect-performance/8363129 – Glenn

答えて

6

がエイリアスを使用していないへの(性能)欠点がありません。しかし、私は多くがあなたの好みの反対に同意すると思います。エイリアスにより、SQL はさらにが読みやすくなります。何があなたに読んで楽しいですか?あなたは何度も文字を入力しなくても、ある

SELECT c.name, p.phone, a.number, ct.fbAddress 
FROM customer c 
INNER JOIN Person p 
ON p.idCustomer = c.idCuster 
INNER JOIN Address a 
ON .... etc 

または

SELECT customer.name, Person.phone, Address.number, SomeOtherTable.fbAddress 
FROM customer 
INNER JOIN Person 
ON Person.idCustomer = customer.idCuster 
INNER JOIN Address 
ON .... etc 

私は10のうち、かつての11倍を選ぶだろうないに言及し、時間保存し、エラーが発生しにくいですエイリアスはありません。も同様に価値があります。

私はそれをあなたに手渡します.1文字のエイリアス(すなわち、acp)は粗いことがあります。しかし、CompanyBillExtensionsというテーブルがある場合は、cbeまたはBillExtの書き込み/読み込みがより簡単で簡単です。

+1

私はあなたの意図を伝えるのかどうかはわかりませんが、あなたの例はOPのポイントを補強しています。あなたが 'a.number'を見ると、すぐに「aは何ですか?」と聞きます。その宣言を捜す必要があります。対照的に、 'Address.number'は完全に曖昧ではありません。 –

+3

@KirkWoll SQLを毎日読んでいるプログラマー、データベース開発者、およびDBAにとって、エイリアスが宣言されている場所は正確にわかります。何かを "捜す"必要はありません。同様に、 'ALongTableName.SomeColumn'を見るのも面倒です。エイリアス宣言のためにクエリを精査する必要がある場合、おそらく熟練と経験は明白ではなく、心の最前線にあるべきです。エイリアスだけが曖昧なコードだけだった場合... –

+0

ほとんどのプログラマ(少なくともJavaとC#では)は完全に*嫌われています* 1文字の変数名(イテレータブロックのように完全に明白な場合を除いて)。そして、それは難しい "どこを見るか"の問題ではありません - 我々はすべてFROM句を見ることを知っています。あなたは*すべて*を見なければならないということです。 –

0

実際には欠点はありません。エイリアスを使用すると読みやすさが向上し、正しく使用するとメンテナンスが容易になると私は主張します。 10-15のテーブルにアクセスしているときに常に1文字のエイリアスを使用している場合、それは名前の問題であり、エイリアスを使用したエイリアスではありません。メンテナンス性は、テーブルの名前を変更したり移動したりすると、エイリアスにリンクされている場所だけが実際にクエリで参照される代わりに変更される必要があるという事実にあります。

+0

名前を変更して可読性を向上させる方法を教えてください。たとえば、「Person」という表が表示されているときは、それが何であるかを知っています。私が "P"、 "Pers"、またはそのようなものを見ると、それを理解するためのモデルを知る必要があります(人は非常に簡単ですが、それほど知られていない概念です)。たとえば、「PersonProfile」が表示されている場合、そのPersonProfileが何であるかわかります。もし私が "PP"、 "PersProf"なんか、私はそれが読みやすさを増やす方法を見ない(おそらく私は間違っている) – mrmuggles

+1

人のようなテーブル名で、おそらくreadablityに影響しませんが、人のように短くて簡潔な名前ではないのですか?ビューまたはマテリアライズド・ビューで、データを集約していて、より具体的な名前がある場合はどうなりますか?エイリアスが非常に有益なシナリオです。最終的に、あなたはもっと読みやすいものを決めました。しかし、一般的に、エイリアスはわかりやすいエイリアスを使用する限り、読みやすさと保守性の両方を向上させることができます。しかしデータベースには、それは重要ではありません。 (つまり、欠点はありません) –

0

"より良い"かどうかは、論争を巻き起こし主観的な問題です。あなたのショーのように短いエイリアスを好む人もいれば、そうでない人もいます。一部の人々はそれについて非常に強く感じています。

実際には、クエリの実行に何らかの違いがあるのではないかと思いますが、長い変数名や短い変数名ではコンパイルされた言語に違いがありますが、コーダーにとっては非常に重要です。

3

問題がありますか?

はい、いいえ。あなたの例では、問題はありません。しかし、自己結合を試みたり、複数のパスを使用して同じテーブルに結合したりする場合は、テーブルを別名で動作させる必要があります。ここ

は同じテーブル(Address)が複数回使用される場合の例である:

SELECT customer.name, home.fbAddress, business.fbAddress 
FROM customer 
LEFT OUTER JOIN Address home ON home.AddressId = customer.homeAddressId 
LEFT OUTER JOIN Address business ON business.AddressId = customer.businessId 
0

エイリアスを使用して動的クエリを作成することは、FROMテーブルソースを変更するだけで簡単ですが、列名や他の場所のジョインを気にする必要はありません...例:

select o.*, od.* 
    from CurrentOrders o 
      join CurrentOrdersDetails od 
       on o.orderid = od.orderid 

他のサーバーのアーカイブに移動しますか?

select o.*, od.* 
    from BackupServer.ArchiveOrders o 
      join BackupServer.ArchiveOrdersDetails od 
       on o.orderid = od.orderid 
0

それは簡単に保守ではありません。なぜフルネームを使用しないのですか?

メンテナンスの容易さは主観的です。 customerpersonが基本表であり、今後何らかの理由で、参考になった基本表ではなく、それぞれcustomerpersonに基づいてビューをターゲットにする必要があるとします。あなたのハウススタイルがテーブル名と同じ相関名(可能な限り)を使用する場合は、の名前を同じクエリに変更する必要があります。ただし、好みのスタイルがテーブル名と同じではない相関名を使用する場合は、変更する必要があるのはという名前のみとなります。

もちろん、ハウススタイルがビューのみをターゲットにしてベーステーブルを使用しない場合は、前述の将来の変更でビュー定義のみの変更が行われる可能性があり、ビューを消費するクエリは変更されません。おそらくメンテナンスが非常に簡単ですが、それはまったく別の考慮事項です)

関連する問題