2012-02-27 13 views
0

カスタム料金表のデータベースにはどのデザインを選択しますか?その理由は何ですか?データベースデザイン:カスタム料金表

オプション1)1台、ユーザーIDは、私は、ユーザーがカスタム料金を持っている場合

ACCOUNT_FEE 
TypeId 
FixedRate 
VariableRate 
CurrencyId 
UserId (UserId is null for default account fee, UserId is present for custom fee) 

オプション2)2つの別々のテーブル、ユーザーのカスタム料のための他のデフォルトの料金で1

ACCOUNT_DEFAULT_FEE 
TypeId 
FixedRate 
VariableRate 
CurrencyId 

USER_ACCOUNT_FEE 
TypeId 
FixedRate 
VariableRate 
CurrencyId 
UserId 
+0

「ユーザーID」の特定の期間のための追加料金のuseageすることができますので、意志の料金に効果的と有効期限を追加することを検討します各ユーザーごとに一意である必要があります。どのようにすればnullになるのですか?ユーザー同士の区別方法 –

答えて

1

私は違っそれを行うだろう。 "Default Account"という名前のユーザーを作成し、特定のID、または "0"(identity_insertが必要な場合もあります)を指定します。これにより、テーブルが参照整合性ルールに従うことができますAND UserIDのインデックスは、デフォルトのアカウント料金をすぐに選ぶことができます。

それ以外の場合は、単一のテーブルを使用して

  • 、それはユーザーIDが2つのテーブルを使用して
  • nullのWHEREだけ取得するには、テーブルスキャンする必要があります、あなたは時に実際に彼らの同期にはまだ別々にそれらを維持する必要がありますただ論理的に同じデータを保存する
+0

ORは、デフォルトでフラグ "IsSystem"(True)を追加するだけで、ユーザーのカスタム料金はfalseです。 – 001

+0

それは良い考えではありません。インデックスを作成しないと、同じ問題が発生します。インデックスに2つのブランチがあり、もう1つのブランチがN-1個のキーを保持し、Nは合計レコード数であるため、新しい顧客固有の料金が追加されるたびにインデックスページの分割が頻繁に発生します。 – RichardTheKiwi

0

を考え決定します次の理由により、最初のデザインを選択してください:

  1. 変更する必要はありませんデザインが進化するにつれて2つのテーブルが追加されます。

  2. フロントエンドのCRUDコードは1つのテーブルにのみ必要です。特定のタイプの顧客の「正しい」の手数料を取得

  3. は単純です:

    SELECT TOP 1 * FROM ACCOUNT_FEE 
    WHERE 
        (UserId=333 OR UserId IS NULL) 
        AND TypeId=2 
    ORDER BY UserId DESC 
    
0

私は、カスタム料金をシングルテーブル方式にすることをお勧めします。これは、カスタム料金が必要に応じて追加できることを意味します。

追加の強化は - それはカスタム料がアクティブなときに見つけることは容易であり、時間

関連する問題