1


2

データベース設計ヘルプ-階層データ

そのため、ユーザーアカウント(ユーザー)のテーブルがあります。 サブアカウント用の機能が必要です。

そのため、たとえば、Dunder Mifflinという名前の会社にはアカウントがあります。 会社には、サブアカウント、経理および販売があります。 アカウンティングアカウントには、ケビン、アンジェラ、オスカーのサブアカウントがあります。 また、レベルの数に制限はありません。

私の最初のアイデアは、このようなテーブルを作成することでした:

CREATE TABLE Users
(
    UserID INTEGER,
    ParentUserID INTEGER,
    ...
)

プライマリアカウントのParentUserIDは単にnullですが、サブアカウントにはその親のUserIDが含まれます。

これはこれに適した設計ですか? 他の方法は知りません。

4 Answer


4


それは良いデザインです。 別の方法は、HIERARCHIDデータ型を使用して階層をマッピングすることですが、そのサポートは制限されています(レポート、ORMツールなど)。

実際、私はこれをいくつかのセットアップで正確に使用しています。 明らかにダンプではない選択肢が多すぎない(階層にXフィールドがあるなど)。 私は実際に、単一の代替案を知りません。


2


それは良いデザインであり、他に選択肢はほとんどありません。 CTE(Common Table Expressions)を読むと、この階層関係を(再帰的に)照会できます。

階層構造の再帰クエリはSql Server 2000で可能でしたが、2005年以降のCTEで大幅に簡素化されました。

それ自体に結合するテーブルは、デザイナーでは次のようになります。image:https://i.stack.imgur.com/FUv1J.png [Self Join Cap]


2


これは自己結合と呼ばれ、はい、それは階層データを表す標準的な方法です。 おそらく、http://msdn.microsoft.com/en-us/library/ms186243.aspx [this]のようなクエリを実行して、Dunder Mifflinに関連付けられているすべてのユーザーのようなものを取得する必要があります。


0


サブアカウントは何に使用されますか? データベースの設計は重大な問題です。 以前の回答では、あなたが実証する設計は定義上良好であると主張しています。 階層データがある場合、はい、常に親IDがあります。 ただし、多くの場合、アカウントが属するグループアカウントのようなものがあります。 これは、階層を設定するのにより適切な場所です。