powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите со структурой БД. Вложенная структура продавцов
20 сообщений из 20, страница 1 из 1
Подскажите со структурой БД. Вложенная структура продавцов
    #35972413
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо разработать структуру базы на SQL Server 2005.
Есть продавцы, у которых могут быть подчиненные продавцы, и у которых тоже могут быть подчиненные продавцы и т.д.
Короче структура продавцов неограниченной вложенности.
При этом у каждого продавца есть баланс (долг), которые продаже и оплате в кассу, и при этом данное уменьшение/увеличение должно действовать на баланс всех родительских продавцов на такую же сумму.
При этом могут быть изменения родителя у определенного продавца, т.е. он может работать у другого продавца. С учетом этого вся информация о продажах и балансах продавцов должна быть целостной.
В форуме SQL Server 2005 я обсуждал проблему учета баланса продавца и родительских объектов.


И структура которую я думаю реализовать пока что такая:
Таблица продавцов:
TblUsersIDCurrentParentUser_IDCurrentBalance_ID

Таблица балансов продавцов:
TblBalancesIDUser_IDParentUser_IDBalance


Таблица продаж:
TblSellsIDBalance_IDSellSumCanceled

Булевое поле Canceled, указывает не отменена ли продажа. При отмене долг продавца и всех родителей данного продавца должен уменьшится на отмененную сумму. Или же наоборот, когда проводится отмененная продажа.

Так как, баланс продавца для каждого родительского контрагента отдельный, даже при перемещении остается история и сохраняется целостность данных. Т.е. при отмене продажи и т.д. баланс продавца пересчитается правильно.
Схематично, все это выглядит следующим образом:
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972666
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда продавец уходит к другому родителю, он "уносит" баланс с собой?
Нужно хранить историю подчиненности продавцов?
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972717
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет не уносит
эта информация должна оставаться.
Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей.
При смене родителя на Петрова, баланс создался заново, и начался он с нуля.
А при возврате, к Иванову, он продолжается со 100 рублей.
И для этого я создал таблицу:
TblBalancesUser_IDParentUser_IDBalance

Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении"
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972727
orunbekнет не уносит
эта информация должна оставаться.
Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей.
При смене родителя на Петрова, баланс создался заново, и начался он с нуля.
А при возврате, к Иванову, он продолжается со 100 рублей.

Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении"
как говорила Алиса в стране чудес.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972730
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все страньше и страньшеorunbekнет не уносит
эта информация должна оставаться.
Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей.
При смене родителя на Петрова, баланс создался заново, и начался он с нуля.
А при возврате, к Иванову, он продолжается со 100 рублей.

Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении"
как говорила Алиса в стране чудес.

хотел бы сделать чтобы не перемещались, но работа этого требует
а вариант того, чтобы при перемещении создавался новый продавец не сойдет
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972754
orunbekнет не уносит
эта информация должна оставаться.
Скажем продавец Иванов подчинялся Алексееву, и баланс в данном случае 100 рублей.
При смене родителя на Петрова, баланс создался заново, и начался он с нуля.
А при возврате, к Иванову, он продолжается со 100 рублей.

Которая и хранит историю перемещения, грубо говоря, и баланс для продавца в каждом конкретном "подчинении"
orunbek
хотел бы сделать чтобы не перемещались, но работа этого требует
а вариант того, чтобы при перемещении создавался новый продавец не сойдет
можно еще раз, куда девается долг продавца Иванова, когда он перешел к Петрову?
а) зависает в воздухе
б) остается на Алексееве
если б), тогда вопрос, Алексеев так и будет отвечать за этот долг, если Иванов к нему так и не вернется?
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35972841
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишущий_гость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
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973055
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин, здесь один момент не учел, при перерасчете баланса одного продавца, пересчитывались балансы и родителей, с тем учетом, что и родители могут тюда-сюда "перепригывать". Поэтому надо добавить в таблицу TblBalances столбца ParentUserBalance_ID, который указывает на баланс родителя.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973146
Фотография Taper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если в таком направлении:

сущность
Код: plaintext
Продавцы
UserID суррогатный ключUserName имя продавцаParentID имя старшего продавца

сущность
Код: plaintext
Иерархия
ParentID ID старшего продавца ChildID ID подчиненного продавцаLoan размер долга подчиненного к старшему
причем в сущности
Код: plaintext
Иерархия
первичный ключ является составным.

На первый взгляд как будто все получается.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973147
Фотография Taper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если в таком направлении:

сущность
Код: plaintext
Продавцы
UserID суррогатный ключUserName имя продавцаParentID имя старшего продавца

сущность
Код: plaintext
Иерархия
ParentID ID старшего продавца ChildID ID подчиненного продавцаLoan размер долга в данном отношении подчиненного к старшему
причем в сущности
Код: plaintext
Иерархия
первичный ключ является составным.

На первый взгляд как будто все получается.

-------
точнее будет так.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973156
Фотография Taper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как предполагаю в данной схеме осуществлять:
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 и как бы все.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973479
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orunbekИ структура которую я думаю реализовать пока что такая:
Таблица продавцов:
Таблица балансов продавцов:
Таблица продаж, отмены продаж:

это правильно
+
таблица групп продавцов - иерархическая
баланс считать динамически
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973630
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2taper

такая и структура у меня, но проблема еще, которую обнаружил, еще и родители же могут перемещаться

В связи с этим надо такую структуру сделать:

Таблица продавцов:
TblUsersIDParentUser_IDBalance_IDFullName

Таблица балансов
TblBalancesIDParentUser_IDParentUserBalance_IDUser_IDBalance
Данная таблица, будет указывать и на то, какой продавец кому подчинялся. И еще, история того, какой баланс был у его родителя, т.е. ParentUserBalance_ID. Так как и родитель продавца может перемещаться.

TblSellsIDBalance_IDSellSumCanceled
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35973867
taper_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orunbek
такая и структура у меня, но проблема еще, которую обнаружил, еще и родители же могут перемещаться

Предлагаю в значении Loan хранить долг не цепочки продавцов, а именно младшего старшему. Долг цепочки считать же по мере необходимости.
Если провести аналогию иерархии подчиненности древовидному графу, то в графе Loan будет хранится вес (то есть долг) конкретной одной ветви.
На мой взгляд нет необходимости знать когда и как
orunbekкакой продавец кому подчинялся.
Важно знать, какой продавец какому продавцу сколько должен непосредственно . Опять же переходя к графам-деревьям: на мой взгляд следует хранить вес отдельной ветви, а не пересчитывать все веса сверху донизу. Еще раз, вес отдельной ветви это долг Пуха конкретно Кристоферу Робину . Сюда не входит вес ветви - долга Пятачка к Винни Пуху . Сюда также не входит вес ветви - долга Крошки Ру к Винни Пуху
Получается в таблице Долги будет храниться описание графа продавцов с весами ветвей. Конкретное актуальное состояние графа хранится в таблице Продавцы .
Получается история как бы хранится в таблице Долги.

orunbekДанная таблица, будет указывать и на то, какой продавец кому подчинялся. И еще, история того, какой баланс был у его родителя, т.е. ParentUserBalance_ID. Так как и родитель продавца может перемещаться.
Зачем подчиненным продавцам знать о долгах старших? "Старшим в ж%пу не заглядывают" © армейское ;)

P.S. у меня ощущение, что ты вносишь излишнюю на мой взгляд сложность в решение задачи. И так же как будто мой вариант подходит для хранения долгов. Однако опыт не очень большой, и крайне любопытно было бы узнать мнение уже съевших собаку на этом деле.
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35974286
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На вашем же примере попробую имитацию проблемы пересчета баланса привести:
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
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35974341
taper_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тогда предлагаю сделать дополнение для таблицы Продажи :
продажи :
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
это навскидку. Хотя конечно напрашивается вывод, что таблица Продажи будет увеличена на дополнительное поле, дополнительные расходы и все дела.
Но зато (на мой взгляд) прозрачная структура данных. Понятная.
Как такой вариант?
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35974353
taper_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orunbek
И из-за этого и мои предложения по долгам :
Долги (буду писать именами, чтобы понятнее было):
ID ParentID UserID Loan ParentUserBalance_ID1 Null Робин 0 Null2 РобинПух100 13 РобинКенга90 14 ПухПятачок20 25 КенгаРу50 3
лично мне очень не нравится наличие поля ParentUserBalanceID. Это на мой взгляд вносит какие-то избыточные связи в базу данных.
Повторюсь, это все субъективное мнение. Может быть опыт подскажет другое
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35975200
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, скажем
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35976782
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь уже как бы законченная мысль, покритикуйте пожалуйста:
SQL Server
...
Рейтинг: 0 / 0
Подскажите со структурой БД. Вложенная структура продавцов
    #35977418
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, попробуйте почитать про медленно-меняющиеся измерения(Slowly Changing Dimension), возможно вам поможет. Вкратце идея такая - вы храните все "прыжки" с датой актуальности, и можно на любую дату получить данные, актуальные в тот момент, а не сейчас.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите со структурой БД. Вложенная структура продавцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]