Я пытаюсь выяснить, как лучше всего представить мои данные в моей базе данных, желательно без нулевого 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