Избежание обнуляемого FK - Дизайн базы данных - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь выяснить, как лучше всего представить мои данные в моей базе данных, желательно без нулевого FK (sql server).

У меня есть сайт, на котором пользователь должен купить членство (ежемесячная подписка), может покупать рекламу, покупать кредиты, чтобы делать больше вещей на сайте.

Так что я подумал, чтоэти таблицы

Company
 -normal company columns
Plan 
  - Limitations (json, that contains all the limitations of what membership allows, ie can do x amount of seraches)
   - Name (ie Membership lv 1)
   - Price
   - Qty 
   - Unit (Monthly, Credit, etc)
PlanTypes
    - Type (membership, addon, ad)
CompanyPlans (junction table)
    - PlanId
    - CompanyId
    - Limitations (Json) - this would store like when their membership expires or how many credits they have left. If they would extend membership or buy credits the rows would be updated, so there would be business rules to basically make sure 1 row per plan per company, though this would not work really for ads as they can buy more than 1 ad.
Ads
 - normal add columns
 - Start
 - End

Итак, моя проблема, с которой я сталкиваюсь, состоит в том, что Plan table - это таблица, которая отслеживает, если их членство подписка, кредиты, которые я думаю, хорошо.

Однакокогда дело доходит до рекламы, это становится странным, так как сейчас я планировал поставить отношения с Company.Так что теперь для рекламы неожиданно проверка того, активны они или нет, выполняется в таблице объявлений, где все остальное находится в таблице CompanyPlan.

Что еще хуже, даты начала и окончанияобъявления все еще дублируются в таблице CompanyPlan для согласованности?

Я действительно не хочу пытаться разбить таблицу Plan на что-то вроде таблицы подписки, таблицы дополнений и таблицы объявлений, так как я планирую order history & order history line table, которая связана с купленным продуктом, и яя не хочу иметь 3 разных отношения к таблице строк истории заказов и всегда иметь 2 отношения FK, равные NULL, так как я думаю, что это тоже плохо.

Еще один вариант, о котором я думал, но опять же, я не уверенесли это плохая практика, это поставить отношение объявления на CompanyPlan Junction Table и оставить дату начала / окончания в Company Table и другую информацию в Ad table.

Пример данных

Company

Id Name
1  My Compnay

PlanTypes
Id  Type
1  Membership
2  Addon
3  Ad


Plans

Id PlanTypeId Limitations Name Price Value Unit
1   1         {Searches: 100} Plan 1 $30  1  Month
2   2         {}              Extra Searches $10  100 Credits
3   3         {}              Ad1    $100  1   Month

CompanyPlan
Id  PlanId   Limitations CompnyId
1   1        {Start: "2018-01-01", End: {2018-02-01}, 1
2   2        {ExtraSearches: 100}, 1
3   3        {AdStart: "2018-01-01", AdEnd: {2018-02-01}, 1

Ads
Id CompanyId Start End
1  1         2018-01-01  2018-02-01

Order History
Id  CompanyId
1    1

Order Lines
Id   OrderHistoryId  PlanId
1      1              1
2      1              2
3      1              3

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Для начала, как The Impaler уже упоминал в своих комментариях, обнуляемый FK не является плохой вещью, если используется правильно.Я бы разработал ваши таблицы следующим образом:

Company
-Id
-Name

Plan
-Id
-Name
-Details

Addon
-Id
-Value

DefaultPlanAddon
-Id
-Plan_Id
-Addon_Id

Subscription
-Id
-Company_Id
-Plan_Id
-Start
-End

SubscriptionAddons
-Id
-Subscription_Id
-Addon_Id

Advertisement
-Id
-Subscription_Id
-Content
-Start
-End

Большинство таблиц довольно просты, я думаю.

Компания

Все данные дляопределить компанию / клиента.

План

Основные сведения о плане.

Аддон

Здесь становится немного интереснее.В этой таблице все аддоны сохранены.В моем понимании аддоны можно использовать для разных планов.Если это не так, вы можете добавить что-то вроде PlanAddons таблицы, которая содержит информацию о том, какие планы могут иметь какие дополнения.Значение содержит то, о чем этот аддон.Может быть, около 100 дополнительных добавок или что-то другое.Что касается того, что я знаю, вы можете использовать простую строку в качестве типа, поскольку аддон - это в основном Id и описание того, чем является этот аддон.

Подписка

Iбудет отдельно сделать таблицу подписки.Вы также можете сохранить дату начала и окончания каждой подписки.При этом у вас также есть история покупок и вам не нужна таблица OrderHistory .Если начальная дата не совпадает с датой покупки, вы можете легко добавить столбец PurchaseDate .

SubscriptionAddon

В эту таблицу включены все дополнения дляконкретная подписка, так как одна подписка может иметь много надстроек.

DefaultPlanAddon В этой таблице хранятся надстройки по умолчанию для каждого плана.Эта информация используется только в том случае, если компания покупает подписку.Ваша логика ищет, какие надстройки по умолчанию есть у плана, и помещает int вместе с другими разыскиваемыми надстройками в таблицу SubscriptionAddon .

Реклама

Здесь все добавления хранятся.Также с началом и концом.Как и с подпиской, вы можете использовать эту таблицу и для OrderHistrory .

0 голосов
/ 25 мая 2018

После прочтения вашего случая вот что я думаю:

  • Я думаю, что в рекламной таблице (объявлениях) должна храниться дата начала / окончания объявления.
  • Соотношениеот company до ads равно 1: n.Таким образом, ads имеет внешний ключ, указывающий на company.
  • Таблица компании не должна хранить дату начала / окончания объявления, поскольку та же самая компания может купить больше объявлений в будущем.Когда это произойдет, новое объявление получает дату начала / окончания, не затрагивая старое объявление, которое может устареть на этом этапе.

Это должно поддерживать чистоту модели без (опасной) избыточности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...