2013-09-10 3 views
0

Я не очень хорошо разбирается в базах данных, но если у меня есть эта установка:базы данных отношений и «структура»

Payment -> Advances -> Advance Payments 

Таким образом, payment может иметь advance в результате нехватки в общем объеме за счет. Для клиента, когда вы хотите сделать advance payment, вы должны «замаскировать» advance payment как payment - для собственных целей учета. Как я могу это сделать.

Прямо сейчас, advances есть внешний ключ payments и advance payments имеют внешние ключи к advances.

Простой сценарий:

У нас есть порядок, который составляет $ 100. Клиент платит 80 и 20 долларов США. Таким образом, мы создали advance (предварительный 1), который прилагается (fk'd) к этому payment (платеж 1). Клиент заказывает еще раз, и общая сумма составляет 50 долларов США на этот раз и платит только 40 долларов, поэтому другой advance (аванс 2) создан привязан к этому новому payment (платеж 2).

Когда клиент решает, что они хотят, чтобы погасить advances в payment создаются (оплата 3) и advances (авансы 1 и авансовые 2) добавляют к этому payment (оплате 3). Это делается так, что, когда он отображается в системе, у сотрудника есть возможность выбрать, для чего нужно внести advance. Это не так просто, как получить общее количество, а затем вычесть сумму payment.

Так что, когда они входят в количестве, которое advance payment создаются и прикрепляются к этому advance, потому что advance payments являются fk'd к advances.

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

Я не хочу нарушать мою структуру payment - advance - advance payment - или я? Я думал только о том, что у меня paymentids в таблице advance payment, но это создаст связь между payments и advance payments, которая пренебрегает advance, который является средним человеком. Возможно, я думаю об этом неправильно, но я не уверен.

Некоторые подробнее:

Payment Table 
------------- 
id : pk 
amount 

Advance Table 
------------- 
id 
amount 
paymentId // payment that created the advance 

Advance Payment Table 
--------------------- 
id 
amount 
advanceId 

Что им предлагают, в котором я думаю, что это неправильно является:

Payment Table 
------------- 
id : pk 
amount 

Advance Table 
------------- 
id 
amount 
paymentId // payment that created the advance 

Advance Payment Table 
--------------------- 
id 
amount 
advanceId 
paymentId <---- add paymentid 

Я думаю, что это нарушило бы структуру/поток и оплаты больше не будет иметь аванс, который имеет авансовые платежи.

Немного больше информации - мы используем linq и SQL Server 2008. Я не знаю, имеет ли это значение.

Возможно, это очень запутанно, но я попытался объяснить это наилучшим образом.

+0

Это похоже на чрезмерно сложную структуру. Я думаю, вы могли бы сделать с 'Order' и 'Payment' only, как записи журнала. Сначала заказ имеет отрицательный платеж, сумму заказа. Продвижение - это разница между первым отрицательным платежом и последующими платежами. –

+0

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

ответ

0

Если у вас есть advanceId в таблице AdvancePayment, он уже привязан к таблице «Оплата». Поэтому я не вижу необходимости в другом внешнем ключе.

Итак, если я правильно понял вашу историю. Цена заказа должна быть равна сумме платежа и аванса. Затем сумма суммы AdvancePayment должна быть равна привязке Advance.

SELECT AP.id FROM AdvancePayments AP 
INNER JOIN Advances A 
ON AP.advanceId = A.id 
INNER JOIN Payments P 
ON A.paymentId = P.id 
WHERE P.id = 1 
+0

да, мы могли бы это сделать, однако проблема заключается в том, что при авансовом платеже мы создаем объект платежа и отправляем его клиенту через webservice - этот объект оплаты имеет все авансовые платежи по нему. когда мы отправляем этот платеж, нет никакой корреляции между оплатой и предоплатой – user2238556

+0

Хорошо, ты меня потерял. Зачем нужен новый платеж, когда производится авансовый платеж. Потому что авансовый платеж основан на выплате аванса. И это продвижение происходит из уже существующего платежа. Похоже, вы хотите хранить две разные вещи в одной таблице. – Wietze314

+0

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

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