web-dev-qa-db-ja.com

SQL Serverのユーザー定義データ型はどれほどクールですか?

SQL Serverのユーザー定義データ型は、中間SQLユーザーが知って使用する必要があるものですか?

UDTを使用することの長所と短所は何ですか?

18
David Vidmar

絶対に使用しないことをお勧めします。定義を変更しなければならない場合、あなたは傷ついた世界にいます。おそらくこれはSQLServer 2000以降改善されており、新しいバージョンに精通している人なら、水に入るのが安全かどうかを知ることができますが、これを確認して自分でテストするまでは、私の本番システムには入れないでください。

詳細については、この質問を確認してください: Sql Server 2005でUDTの基本タイプを変更するにはどうすればよいですか?

17
HLGEM

私はコードベースのUDTを使用していません。なぜなら、余分な複雑さが利点を正当化するとは思わないからです。私doはT-SQL UDTを使用します。これは、余分な複雑さがほとんどないため、その利点は努力する価値があるためです。 (私の元の投稿が不完全であったことを指摘してくれたMarc_sに感謝します!)

コードベースのUDTについて

このように考えてください。プロジェクトにマネージコードコンポーネント(アプリ)とデータベースコンポーネント(SQL Server)がある場合、データベースでマネージコードを定義することで実際にどのような利点が得られますか?私の経験では?無し。

DBデプロイメントにアセンブリを追加し、SQL Server内でこれらのアセンブリを変更したり、ファイルを追加したりする必要があるため、デプロイメントはより困難です。また、SQL ServerでCLRをオンにする必要があります(大したことではありませんが、パフォーマンスやメモリのペナルティがないことは誰にも証明されていません)。最終的には、これをアプリケーションのコードに単純に設計した場合とまったく同じようになります。パフォーマンスがいくらか向上するかもしれませんが、それは時期尚早の最適化のケースとして私を本当に驚かせます-特にCLRをオンにするかオフにするかによって全体のパフォーマンスが低下するかどうかわからないためです。

注:SQLServerのCLRを使用して型を定義すると想定しています。 HLGEMはSQLServer 2000について話しますが、私は2000に精通しておらず、外部で定義されたdllにUDFだけがあり、UDTはないと思っていました(ただし、引用しないでください...私は本当によく知りません!)。

T-SQL UDTについて

T_SQL UDTは、SQLのみで定義できます(SQL Server Management Studioの[プログラマビリティ|タイプ|ユーザー定義データタイプ]に移動します)。標準のUDTの場合、私は実際にそれらを習得することをお勧めします。それらは非常に簡単で、DDLをより自己文書化することができ、整合性制約を適用できます。たとえば、Genderフィールドで適切なデータのみが許可されるようにする「GenderType」(char(1)、null許容ではなく、「M」または「F」を保持)を定義します。

UDTは全体的に非常に簡単ですが、 この記事 は、UDTで許可されるデータを制約するルールを定義することにより、UDTを次のレベルに引き上げる方法のかなり良い例を示しています。

私が最初にこの質問に答えたとき、私は複雑なコード定義型のアイデアに固執しました(Palmを額にスマックします)。だから...マークに感謝します。

13

ユーザー定義型の長所は 非常によく対処されています AlexPapadimoulisによるものです。短所はここでよく述べられています。

また、sp_bindrule関数は、Alexの投稿で指摘されているように、非推奨になりました。いつ廃止されたかはわかりませんが、現在は廃止されています。実際、ルールは全体として非推奨になっています。

制限付きの型を作成したい場合は、適切な列にチェック制約があるユーザー定義のテーブル型を使用することを検討します。これにより、複雑なデータ型を構築する方法も得られます。

Mssqlから成長し、別のdbmsに移行するときに、SQL実装固有の機能を使用することをお勧めすることはできません。 dwh dbについては、mssqlで開始し、Oracleに移行し、昨年からhpverticaに卒業しました。

0
Werner Falkmann