ヌル

2009-08-29 5 views
2

のscenerio:ヌル

私は階層的なレコードを持つフォルダテーブルを持っています。行のIDはGUID型です。テーブル上のParentIDは、親フォルダのIDを格納します。

  • ID(GUID)
  • フォルダ名(varchar型)
  • のParentID(GUID)

質問:

何トップレベルのフォルダを挿入するためのベストプラクティスですか? parentID列をnullにするか、 "ト​​ップレベル"レコード(ID = Guid.Empty)を作成し、そのIDをトップレベルのフォルダに使用する必要がありますか?

答えて

5

guid.emptyはSQL値ではありません。ルートレベルにParentID nullを作成します。

あなたはSQLネイティブについてnullを知っているのに対し、根の値を選択するように{00000000-0000-0000-0000-000000000000}をハードコーディングする必要があります:

select * from mytbl where parentid is null 

また、あなたは親子を構築している場合はSQL Server 2008の新hierarchyidデータ型に見えます表。ツリーを横断するために再帰的なCTEを構築する必要がありません。

+2

私たちは論理的なERDをどのように見ていたかによって、これらの関係を「ブタの耳」と呼びました。これがOracle上にある場合は、CONNECT BY PRIOR id = parentidを使用します。 –

1

間違いなく列をNULLにすることはできません。過去には、親としてトップレベルのノードポイントを作成しましたが、空のGUIDは特別なチェックを必要とする限り多かれ少なかれ同じです。

0

私は、ルートを表す静的GUIDを作成するか、フォルダ自体を示す自己参照としてParentIDにIDを割り当てます。

-2

特別な値としてnullを使用することは、悪い習慣と反パターンです。

ヌルはすでに値なしであるデータベース内で意味を持ちます。すべてのデータベースシステムは、このためにプログラミングされています(SQL標準によって、nullからtrueへの操作は決して評価されません(特殊なケース「is not」null」を除く)。

あなたのケースに最適な特別な値を選択してください。それを使用

+1

この場合、 'null'は' ParentID'に値*がないことを意味します。反パターンではないだけでなく、ベストプラクティスです。このパターンは、データウェアハウスではあまり一般的ではありません。したがって、実際には、SSASのルートレベルを決定するためのデフォルトフラグは 'ParentIsSelfOrMissing'です。つまり、' ParentID'は独自のIDまたは 'null'です。 – Eric

+0

あなたは自分自身と矛盾しています - 与えられた関数の例では、親行に対して特別な値があります。それがヌルを占めるという事実は、それをそのように使うのは良い習慣であることを証明しません。それを使っている人もベストプラクティスにはならないという事実。 Gotoステートメントは一般的に使用されていましたが、人々は最終的にそれから離れていくことを実現しました。与えられた選択肢のベストプラクティスは、null以外の特別な値になります。 nullに対する簡単な引数私はすでに、あなたの例の関数のような特別な余分なチェックが常に必要であるということをしました。 – topchef

0

を直接質問に答えるために、あなたはGUIDフィールドにNULL値を使用する必要がありますSQLの多くの関係へ1の2種類があります - 。。それは、多くの1、多くの0/1である

これを正しく実装すると、キーフィールドにnull値を使用して、関係がないことを示します。つまり、0から多の関係になります。これは変わらない。

ゼロガイドを使用しないでください。これは私の意見では悪いことです。あなたは、null値が置き換えられていることを確認するために、コード内にゼロガイドの使用をすべてキャプチャする必要があります。 Guid.Emptyの値をDatabase Nullに変換するためのデータベース関数を作成しました(SQL Serverの場合、db実装を指定しません)。他のデータベースプラットフォームでもこの考え方に従うことができます。ここ

リンク:http://www.ifinity.com.au/Blog/EntryId/81/Detecting-an-Empty-Guid-in-Sql-Server-in-T-Sql-Syntax

0

実際には、これはちょうどC#の質問ではありません。ソフトウェア開発者のほとんどはこの決定に直面していました。 私の選択はトップの親としてnullを使用しています。このため、

シナリオ1:PARENTID列でNULLを使用できない場合は、でなければならないすべての

の1-)まず、我々は

2)最初のレコード(トップ親のParentIDとID列の間のテーブルの外部キー関係を指定する必要があります)のPARENTIDは、自身のIDに等しい

これは悪い練習です。これは関係が無限ループになるためです。

シナリオ2:null可能なPARENTID列を使用する場合。

1)大部分のDBMSは、幸いなことに、外部キーの関係にNULL値を許可します。

2)これにより、PARENTIDにヌル値を持つだけで、最初のレコードまたは他のレコードをトップの親ローにすることができます。

無限ループを作成する必要はありません。 ヌルチェックを忘れる、または特別な値を忘れることは、私が思うに違いありません。 私たちはすでに特別な値を持っていますが、これはヌル値です。

私は早めにEmpty Guidを使用しています。そして、「選択してください」、「選択する」などのレポート項目が表示されます。親の親(Empty Guid)のためです。だから私はそれを確認する必要があります。