2010-11-19 15 views
1

私はユーザーアカウント(ユーザー)のテーブルを持っています。サブアカウントには機能が必要です。データベース設計のヘルプ - 階層データ

たとえば、Dunder Mifflinという名前の会社がアカウントを持っている可能性があります。会社には、会計と会計のサブアカウントがあります。アカウンティングアカウントには、Kevin、Angela、Oscarのサブアカウントがあります。レベルの数に制限はありません。

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

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

プライマリアカウントのParentUserID122とは、単にnullになりますが、サブアカウントは、親のユーザーIDが含まれます。

これは良い設計ですか?私は他の方法を知らない。

+0

私には似ています。 – rwilliams

+0

これは良いアプローチです。デザインは隣接リストと呼ばれます。 SQL Serverの共通テーブル式を使用すると、解決しようとしている問題に対して比較的容易にアプローチできます。データベースの階層を表す方法の詳細については、次の質問を参照してください。http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – orangepips

答えて

2

これは良いデザインであり、実際にはほとんど選択肢がありません。あなたはこの階層関係照会役立ちますCTEs (Common Table Expressions)上に読んで(再帰的に)階層構造の

再帰クエリは、SQL Server 2000で可能であったが、はるか2005年

自体に参加するテーブル以来のCTEに簡略化されています Self Join Cap

+0

CTE <==>共通テーブル式? – John

+0

@ジョン:はい、ありがとうございます。回答が更新されました。 –

+0

ありがとうございました! – John

4

それは良いデザインです。代わりに、HIERARCHIDデータ型を使用して階層を整理することができますが、そのサポートは限られています(レポート、ORMツールなど)。

実際、私はこれをいくつかの設定で正確に使用しています。明らかにダンプされていない選択肢があまり多くないだけです(階層のXフィールドを持つようなもの)。私はただ一つの選択肢がないことを知っています。

+0

階層IDは限られたツールサポートを持っていますが、構文を学ぶと非常に便利なクエリオプションが提供されます。特に、無制限の階層を持つ階層のコンテキストで役立ちます。 –

2

これは、階層型データを表す標準的な方法です。これは、デザイナーで次のようになります。あなたはおそらくthisのような質問をして、Dunder Mifflinに関連するすべてのユーザーのようなものを得る必要があります。

0

サブアカウントは何に使用されていますか?データベース設計は深刻な問題です。 これまでの回答では、デモンストレーションしたデザインは定義上良いと主張しています。階層データがある場合は、常に親IDを持ちます。ただし、非常に頻繁に、アカウントが属するグループアカウントがあります。それは階層を設定するより適切な場所になります。

+0

したがって、Accountsテーブルを参照する外部キーを持つ階層型AccountテーブルとUsersテーブルを持つことになります。 – Nickolodeon