|
|
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
Необходимо разработать структуру базы на SQL Server 2005. Есть продавцы, у которых могут быть подчиненные продавцы, и у которых тоже могут быть подчиненные продавцы и т.д. Короче структура продавцов неограниченной вложенности. При этом у каждого продавца есть баланс (долг), которые продаже и оплате в кассу, и при этом данное уменьшение/увеличение должно действовать на баланс всех родительских продавцов на такую же сумму. При этом могут быть изменения родителя у определенного продавца, т.е. он может работать у другого продавца. С учетом этого вся информация о продажах и балансах продавцов должна быть целостной. В форуме SQL Server 2005 я обсуждал проблему учета баланса продавца и родительских объектов. И структура которую я думаю реализовать пока что такая: Таблица продавцов: TblUsersIDCurrentParentUser_IDCurrentBalance_ID Таблица балансов продавцов: TblBalancesIDUser_IDParentUser_IDBalance Таблица продаж: TblSellsIDBalance_IDSellSumCanceled Булевое поле Canceled, указывает не отменена ли продажа. При отмене долг продавца и всех родителей данного продавца должен уменьшится на отмененную сумму. Или же наоборот, когда проводится отмененная продажа. Так как, баланс продавца для каждого родительского контрагента отдельный, даже при перемещении остается история и сохраняется целостность данных. Т.е. при отмене продажи и т.д. баланс продавца пересчитается правильно. Схематично, все это выглядит следующим образом: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 16:29 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
Когда продавец уходит к другому родителю, он "уносит" баланс с собой? Нужно хранить историю подчиненности продавцов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 17:26 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
нет не уносит эта информация должна оставаться. Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей. При смене родителя на Петрова, баланс создался заново, и начался он с нуля. А при возврате, к Иванову, он продолжается со 100 рублей. И для этого я создал таблицу: TblBalancesUser_IDParentUser_IDBalance Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 17:42 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
orunbekнет не уносит эта информация должна оставаться. Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей. При смене родителя на Петрова, баланс создался заново, и начался он с нуля. А при возврате, к Иванову, он продолжается со 100 рублей. Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении" как говорила Алиса в стране чудес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 17:45 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
все страньше и страньшеorunbekнет не уносит эта информация должна оставаться. Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей. При смене родителя на Петрова, баланс создался заново, и начался он с нуля. А при возврате, к Иванову, он продолжается со 100 рублей. Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении" как говорила Алиса в стране чудес. хотел бы сделать чтобы не перемещались, но работа этого требует а вариант того, чтобы при перемещении создавался новый продавец не сойдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 17:46 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
orunbekнет не уносит эта информация должна оставаться. Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей. При смене родителя на Петрова, баланс создался заново, и начался он с нуля. А при возврате, к Иванову, он продолжается со 100 рублей. Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении" orunbek хотел бы сделать чтобы не перемещались, но работа этого требует а вариант того, чтобы при перемещении создавался новый продавец не сойдет можно еще раз, куда девается долг продавца Иванова, когда он перешел к Петрову? а) зависает в воздухе б) остается на Алексееве если б), тогда вопрос, Алексеев так и будет отвечать за этот долг, если Иванов к нему так и не вернется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 17:55 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
пишущий_гостьorunbekнет не уносит эта информация должна оставаться. Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей. При смене родителя на Петрова, баланс создался заново, и начался он с нуля. А при возврате, к Иванову, он продолжается со 100 рублей. Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении" orunbek хотел бы сделать чтобы не перемещались, но работа этого требует а вариант того, чтобы при перемещении создавался новый продавец не сойдет можно еще раз, куда девается долг продавца Иванова, когда он перешел к Петрову? а) зависает в воздухе б) остается на Алексееве если б), тогда вопрос, Алексеев так и будет отвечать за этот долг, если Иванов к нему так и не вернется? он остается в таблице TblBalances т.е. живой пример. Есть три пользователя Иванов (0 рублей), Петров (100 рублей), Сидоров (500 рублей). Иванов и Петров никому не подчиняются, т.е. корневые продавцы. Сидоров подчиняется Иванову. Соответственно. TblUsers: ID ParentUser_ID FullName Balance_ID1 0 Иванов 12 0 Петров 23 1 Сидоров 3 TblBalances: ID ParentUser_ID User_ID Balance1 0 1 02 0 2 1003 1 3 500 При перемещнии Сидорова к Петрову, в таблице TblBalances появляется запись: TblBalances ID ParentUser_ID User_ID Balance4 2 3 0 А запись в таблице TblUsers изменяется на следующую: TblUsers: ID ParentUser_ID FullName Balance_ID3 1 Сидоров 4 Указывая на то, что у Сидорова текущий баланс 0, и связан с записью с ID=4 из таблицы TblBalances. При возврате к Иванову, в TblBalances не появляются новые записи, так как уже есть запись, указывающая на баланс Сидорова при подчинении Иванову, т.е. TblBalances: ID ParentUser_ID User_ID Balance3 1 3 500 А запись в таблице TblUsers изменяется на следующую: TblUsers: ID ParentUser_ID FullName Balance_ID3 1 Сидоров 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 18:29 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
Млин, здесь один момент не учел, при перерасчете баланса одного продавца, пересчитывались балансы и родителей, с тем учетом, что и родители могут тюда-сюда "перепригывать". Поэтому надо добавить в таблицу TblBalances столбца ParentUserBalance_ID, который указывает на баланс родителя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 21:10 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
А если в таком направлении: сущность Код: plaintext сущность Код: plaintext причем в сущности Код: plaintext На первый взгляд как будто все получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 22:50 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
А если в таком направлении: сущность Код: plaintext сущность Код: plaintext причем в сущности Код: plaintext На первый взгляд как будто все получается. ------- точнее будет так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 22:52 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
Как предполагаю в данной схеме осуществлять: 1) Исходная позиция: Продавцы UserID UserName ParentID1 Робин Null2 Кролик Null3 Сова Null4 Пух Робин5 Пятачок Пух6 Кенга Робин7 Ру Кенга Долги (буду писать именами, чтобы понятнее было): Робин Пух 100Робин Кенга 90Пух Пятачок 20Кенга Ру 50 2) Допустим Ру перешел к Пуху: тогда: UserID UserName ParentID1 Робин Null2 Кролик Null3 Сова Null4 Пух Робин5 Пятачок Пух6 Кенга Робин7 Ру Пух Робин Пух 100Робин Кенга 90Пух Пятачок 20Кенга Ру 50Пух Ру 0 красным отмечены изменения Чтобы подсчитать все долги Робина и подчиненных продавцов: Собираем таблицу текущей подчиненности (в некоем роде список всех ветвей графа дерева иерархии): Parent ChildРобин ПухРобин КенгаПух ПятачокПух Ру данную таблицу уже можно JOINом соединить с таблицей долгов и получить уже: Parent Child LoanРобин Пух 100Робин Кенга 90Пух Пятачок 20Пух Ру 50 остается найти сумму в столбце Loan и как бы все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2009, 23:09 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
orunbekИ структура которую я думаю реализовать пока что такая: Таблица продавцов: Таблица балансов продавцов: Таблица продаж, отмены продаж: это правильно + таблица групп продавцов - иерархическая баланс считать динамически ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 09:34 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
2taper такая и структура у меня, но проблема еще, которую обнаружил, еще и родители же могут перемещаться В связи с этим надо такую структуру сделать: Таблица продавцов: TblUsersIDParentUser_IDBalance_IDFullName Таблица балансов TblBalancesIDParentUser_IDParentUserBalance_IDUser_IDBalance Данная таблица, будет указывать и на то, какой продавец кому подчинялся. И еще, история того, какой баланс был у его родителя, т.е. ParentUserBalance_ID. Так как и родитель продавца может перемещаться. TblSellsIDBalance_IDSellSumCanceled ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 10:35 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
orunbek такая и структура у меня, но проблема еще, которую обнаружил, еще и родители же могут перемещаться Предлагаю в значении Loan хранить долг не цепочки продавцов, а именно младшего старшему. Долг цепочки считать же по мере необходимости. Если провести аналогию иерархии подчиненности древовидному графу, то в графе Loan будет хранится вес (то есть долг) конкретной одной ветви. На мой взгляд нет необходимости знать когда и как orunbekкакой продавец кому подчинялся. Важно знать, какой продавец какому продавцу сколько должен непосредственно . Опять же переходя к графам-деревьям: на мой взгляд следует хранить вес отдельной ветви, а не пересчитывать все веса сверху донизу. Еще раз, вес отдельной ветви это долг Пуха конкретно Кристоферу Робину . Сюда не входит вес ветви - долга Пятачка к Винни Пуху . Сюда также не входит вес ветви - долга Крошки Ру к Винни Пуху Получается в таблице Долги будет храниться описание графа продавцов с весами ветвей. Конкретное актуальное состояние графа хранится в таблице Продавцы . Получается история как бы хранится в таблице Долги. orunbekДанная таблица, будет указывать и на то, какой продавец кому подчинялся. И еще, история того, какой баланс был у его родителя, т.е. ParentUserBalance_ID. Так как и родитель продавца может перемещаться. Зачем подчиненным продавцам знать о долгах старших? "Старшим в ж%пу не заглядывают" © армейское ;) P.S. у меня ощущение, что ты вносишь излишнюю на мой взгляд сложность в решение задачи. И так же как будто мой вариант подходит для хранения долгов. Однако опыт не очень большой, и крайне любопытно было бы узнать мнение уже съевших собаку на этом деле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 11:36 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
На вашем же примере попробую имитацию проблемы пересчета баланса привести: 1) Исходная позиция: ПродавцыUserIDUserNameParentID1РобинNull2КроликNull3СоваNull4ПухРобин5ПятачокПух6КенгаРобин7КенгаРу Долги (буду писать именами, чтобы понятнее было): ParentID UserID LoanРобинПух100РобинКенга90ПухПятачок20КенгаРу50 Теперь продажи: ID UserID SellSum Canceled1000 Пух 100 01001 Пяточок 200 0 Ситуации: 1. Ру перешел к Пуху тогда долги: ParentID UserID LoadРобинПух100РобинКенга90ПухПятачок20КенгаРу50ПухРу0 2. Пух перешел к Кенге тогда долги: ParentID UserID LoadРобинПух100РобинКенга90ПухПятачок20КенгаРу50ПухРу0КенгаПух0 3. Отменилась продажа с ID 1000, т.е. Продажа Пуха, тогда необходимо уменьшить долг Пуху, когда он подчинялся Робину, и уменьшить долг Робина 4. Отменилась продажа с ID 1001, т.е. Продажа Пятачка, тогда необходимо уменьшить долг Пуху, когда он подчинялся Робину, и уменьшить долг Робина И из-за этого и мои предложения по долгам : Долги (буду писать именами, чтобы понятнее было): ID ParentID UserID Loan ParentUserBalance_ID1 Null Робин 0 Null2 РобинПух100 13 РобинКенга90 14 ПухПятачок20 25 КенгаРу50 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 13:11 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
тогда предлагаю сделать дополнение для таблицы Продажи : продажи : ID UserID SellSum Canceled UserParentID1000 Пух 100 0 Робин1001 Пяточок 200 0 Пух поле UserParentID будет показывать кому подчинялся данный продавец, когда осуществлялась продажа. 1) Отменилась продажа с ID 1000, т.е. Продажа Пуха, тогда необходимо уменьшить долг Пуху, когда он подчинялся Робину, и уменьшить долг Робина Соответственно при отмене продажи с ID 1001 таблицу Продавцы не трогаем совсем. а вносим следующее изменнеие в таблицу Долгов : из таблицы Продаж определяем Parent, Child - которые однозначно определяют строку, где вносим изменение в поле Loan Parent Child LoanРобин Пух 100-100=0Робин Кенга 90Пух Пятачок 20Пух Ру 50 2) Отменилась продажа с ID 1001, т.е. Продажа Пятачка, тогда необходимо уменьшить долг Пуху, когда он подчинялся Робину, и уменьшить долг Робина по ID = 1001 определяем, что надо в таблице Долги найти запись где Parent, Child - Пух, Пятачок, и изменить Loan на 200 Parent Child LoanРобин Пух 0Робин Кенга 90Пух Пятачок 20-200=-180Пух Ру 50 это навскидку. Хотя конечно напрашивается вывод, что таблица Продажи будет увеличена на дополнительное поле, дополнительные расходы и все дела. Но зато (на мой взгляд) прозрачная структура данных. Понятная. Как такой вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 13:28 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
orunbek И из-за этого и мои предложения по долгам : Долги (буду писать именами, чтобы понятнее было): ID ParentID UserID Loan ParentUserBalance_ID1 Null Робин 0 Null2 РобинПух100 13 РобинКенга90 14 ПухПятачок20 25 КенгаРу50 3 лично мне очень не нравится наличие поля ParentUserBalanceID. Это на мой взгляд вносит какие-то избыточные связи в базу данных. Повторюсь, это все субъективное мнение. Может быть опыт подскажет другое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 13:30 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
taper_orunbek И из-за этого и мои предложения по долгам : Долги (буду писать именами, чтобы понятнее было): ID ParentID UserID Loan ParentUserBalance_ID1 Null Робин 0 Null2 РобинПух100 13 РобинКенга90 14 ПухПятачок20 25 КенгаРу50 3 лично мне очень не нравится наличие поля ParentUserBalanceID. Это на мой взгляд вносит какие-то избыточные связи в базу данных. Повторюсь, это все субъективное мнение. Может быть опыт подскажет другое такое поле зачем добавляю, потому что и родитель (Пух, скажем) тоже может поменять родителя и скажем может быть отмениться продажа, которая была сделана. При этом нужно будет пересчитать баланс родителя (Робина) именно того баланса когда Робин был родителем Пуха. А ParentUserBalance_ID такое же поле как и ParentUser_ID в TblUsers, скажем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2009, 17:04 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
здесь уже как бы законченная мысль, покритикуйте пожалуйста: SQL Server ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2009, 14:10 |
|
||
|
Подскажите со структурой БД. Вложенная структура продавцов
|
|||
|---|---|---|---|
|
#18+
Кстати, попробуйте почитать про медленно-меняющиеся измерения(Slowly Changing Dimension), возможно вам поможет. Вкратце идея такая - вы храните все "прыжки" с датой актуальности, и можно на любую дату получить данные, актуальные в тот момент, а не сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2009, 17:59 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35972730&tid=1543264]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 451ms |

| 0 / 0 |
