2015-11-10 1 views
1

Я пробовал смотреть аналогичные сообщения StackOverlow, и кажется, что эти вопросы для ввода о схеме действительны. Кроме того, я являюсь разработчиком программного обеспечения, а не специалистом по базам данных по торговле. Так что, надеюсь, это хорошо.Схема для хранения записей попыток покупок в SQL

Я использую SQL Server, хотя я думаю, что этот вопрос достаточно общий, что он может быть применим практически ко всем SQL-продуктам, поскольку он относится к лучшей схеме для моего сценария.

Я пишу систему реферальных платежей, в соответствии с которой магазины могут кредитовать и возвращать лиц, обращающихся с клиентами. Субъектами являются -

  • Referrer: один, чтобы быть оплачены со ссылкой клиентов,
  • Направление: клиент, который был передан
  • рефералов Покупка: Сумма и дата проведения рефералов покупка.
  • Администратор: тот, кто делает платеж.

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

Смешанная часть всего этого заключается в том, что когда администратор производит платеж, он может потерпеть неудачу по ряду причин (недостаточные средства, реферер дал плохую информацию PayPal и т. Д.). Все это необходимо сохранить, чтобы я мог не только оглянуться назад на прошлые попытки платежа и определить ошибки, и какие покупки в рефералах были вовлечены в неудачу, но также определить, какие реферальные покупки еще не зачислены рефереру.

Лучшая схема я смог разработать следующее: enter image description here

Дела в том, что каждый PaymentAttempt имеет статус платежной попытки (успех/неудача) и каждый реферал покупки, которая была зачислена в попытке платежа есть таблица ссылок, которая связывает ее с попыткой платежа. Таким образом, одна покупка реферала может быть вовлечена в любое количество попыток кредитования реферера, причем последняя является успешной попыткой.

В конечном итоге мой вопрос сводится к следующему: когда мне нужно вернуться, а затем определить, сколько реферера необходимо заплатить позже, будет ли это боль в ближайшие годы, если мне нужно будет запросить ВСЕ реферальные покупки, связанные с реферером, затем присоединяются ко всем ссылкам ссылок ReferralPurchase/PaymentAttempt, а затем присоединяются к соответствующим таблицам статуса PaymentAttempt, чтобы узнать, какие из реферальных покупок еще не зачислены? Я мог видеть, что мне нужно создавать довольно странные запросы, чтобы найти те пять покупок, которые еще не зачислены.

В качестве альтернативы я мог бы обновить сам ReferralPurchase флаг состояния, но считается ли это «проси его» с точки зрения целостности данных (я думаю, что я мог видеть, что некоторые говорят, что это плохой дизайн, поскольку состояние может быть запрошено в другом пути, и, возможно, ошибка может привести к тому, что бит будет установлен без надлежащих записей, чтобы гарантировать это)? Это плохой дизайн?

Или есть какой-то лучший способ проложить вещи?

ответ

0

Постараюсь изо всех сил помочь вам, надеюсь, я правильно понимаю ваш вопрос.Если бы я разрабатывал систему, для меня выделялись две таблицы. Таблицы и их столбцы.

ReferralPurchase

• ReferralPurchase_Id (PK)

• Referrer_Id (Указывая на человека таблицу)

• Направление _ID (Указывая на человека таблицы)

Оплата

• Payment_Id (PK)

• ReferralPurchase_Id (FK)

• AmountToBePaid

• StatusOfPayment

• DateLogged

• DatePaymentMade (Null, если статус не увенчались успехом)

• Admin_Id (Указание на таблицу лиц)

0

Бен, не уверен, что вы подразумеваете под положением. Я бы уклонился от полей статуса жизненного цикла, но рассмотрел бы логическое. Например:

Флаг isPaid в ReferralPurchase будет казаться разумным подходом. Он должен обновляться только при подтвержденном платеже, и если есть запрос о том, почему он был установлен, доказательства будут существовать в форме истории из таблиц PaymentAttempt и ссылок. Это упростило бы запросы о невыплаченных платежах, а ожидающие оплаты просто были бы неполными PaymentAttempts. Существует теоретическая возможность того, что история может противоречить ценности флага.

В качестве альтернативы вы можете иметь флаг isSuccessful в таблице ссылок, который является «ближе к источнику», если я могу так выразиться, поскольку он не может быть так же легко конфликтующим, как и сама история (пока кодер не позволяет отмечать более одной строки, которая является успешной для данного ReferralPayment, например). Обнаружение непогашенных платежей - это только те, которые ReferralPayments , где не существует a isSuccessful запись записи.

Другие будут иметь разные взгляды на это. Дайте нам знать, куда вы идете.

+0

Я думаю, вы в основном получили суть того, что я получаю. Извините за то, что не яснее, но я пытался найти баланс между долгой и подробной. По сути, я пытаюсь решить проблему не быть, поскольку вы ставите его «ближе к источнику». Я могу написать запросы, чтобы присоединиться ко всем таблицам, которые я упомянул, и определить, был ли предоставлен кредит рефереру, но по мере того, как объем данных растет, счет запроса кажется, что он тоже будет расти. Очень быстро. Мне нравится идея поставить флаг isSuccessful на таблицу ссылок, возможно, это хорошая средняя дорога. –

+0

(Я думал, что вы очень понятны.) Я использую эмпирическое правило, «что наиболее просто представляет собой то, как все работает». Это не всегда применимо, но это работает довольно много времени. В этом случае таблица ссылок представляет собой представление истории индивидуальной покупки реферала (или, как мне кажется), поэтому соответствие между моделью и «реальным миром» звучит разумно и, вероятно, приведет к стабильной структуре.Любое работоспособное решение будет иметь компромисс между тем, поддерживаются ли правила в БД или в коде ... Трюк, похоже, заключается в поиске правильного разделения для вашей ситуации. – wwkudu

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