2012-02-27 5 views
0

Какой дизайн вы выбрали бы для базы данных для таблицы пользовательских сборов и почему?Дизайн базы данных: Таблица пользовательских сборов

Вариант 1) 1 таблица, UserId определяет, является ли пользователь имеет собственный гонорар

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

Вариант 2) 2 отдельные таблицы, одна за плату по умолчанию другого для пользовательской платы пользователя

ACCOUNT_DEFAULT_FEE 
TypeId 
FixedRate 
VariableRate 
CurrencyId 

USER_ACCOUNT_FEE 
TypeId 
FixedRate 
VariableRate 
CurrencyId 
UserId 
+0

«USERID» будет быть уникальным для каждого пользователя, как он может быть нулевым, если так, как вы будете различать пользователей –

ответ

1

Я хотел бы сделать это по-другому. Создайте пользователя под названием «Учетная запись по умолчанию» и укажите ему определенный идентификатор или даже «0» (может потребоваться идентификатор_интеста). Это позволяет таблице следовать правилам ссылочной целостности И индекс в UserID может быстро выбрать плату по умолчанию.

В противном случае,

  • используя одну таблицу, она будет иметь к таблице сканирования только, чтобы получить WHERE UserID является нулевым
  • с помощью двух таблиц, вы должны держать их отдельно еще синхронизированы, когда они на самом деле просто логически сохраняйте одни и те же данные
+0

ИЛИ может просто добавить флаг «IsSystem» (True) по умолчанию, false его пользовательскую плату пользователя. – 001

+0

Это было бы неплохо. Если вы не индексируете его, вы получите ту же проблему. Если вы проиндексируете его, это будет практически бесполезно, поскольку индексная страница будет разбиваться очень часто, когда будут добавлены новые тарифы, специфичные для конкретного клиента, поскольку индекс имеет только две ветки, другая ветка будет содержать N-1 ключи, N - общее количество записей. – RichardTheKiwi

0

Я бы выберите первую конструкцию по следующим причинам:

  1. Не нужно менять столы по мере развития дизайна.

  2. Передний код CRUD необходим только для одной таблицы.

  3. Получение клиента «правильный» сбор определенного типа прост:

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

Я бы рекомендовал использовать один стол для пользовательских сборов, что означает, что вы можете добавить дополнительные таможенные сборы, поскольку они могут понадобиться.

Дополнительное усиление - рассмотреть добавление эффективной и даты истечения срока действия на плату, так что легко узнать, когда пользовательская плата активна и позволяет Useage дополнительных сборов за конкретные периоды времени

Смежные вопросы