Процентное распределение для N числа пользователей

#mysql #database #performance #relationship

#mysql #База данных #Производительность #взаимосвязь

Вопрос:

У меня есть таблица, подобная следующей

 Id UserName PercentSharing ParentId
1  one      20             0
2  two      80             1
3  three    40             2
4  four     50             2
5  five     20             3
6  six      30             3
  

Я хочу рассчитать, что весь уровень не должен превышать 100%

Если я изменю процентное распределение для идентификатора 2 на 70, его родительский параметр должен быть обновлен до 30, и если какой-либо процент общего доступа к идентификаторам пользователей 3 или 4 соответствует любым другим значениям, то процентное распределение должно быть равным 100% для всех родительских пользователей. например, общее количество идентификаторов пользователей 3,2,1 не должно превышать 100%

Я хочу поддерживать 100% соотношение для N числа или уровня.

Пожалуйста, подскажите, нужно ли мне изменять структуру таблицы?

Комментарии:

1. Это не проблема структуры БД, а проблема входа, используемого для манипулирования данными. Я не знаю, нужна ли вам такая структура по другим причинам

2. Это своего рода проблема с хранилищем процентного распределения в БД и вычислениями. Мне нужна помощь в том, как хранить такого рода данные в БД с N уровнем взаимосвязи.

3. Здесь нет уровней

4. Вычисляйте процентное распределение на лету; не выполняйте предварительных вычислений. То есть сохраняйте «взвешивание», а не конечный «pct».

Ответ №1:

Рассмотрим следующее; вложенная модель…

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id CHAR(1) NOT NULL PRIMARY KEY
,pct INT NOT NULL
,lft INT NOT NULL
,rgt INT NOT NULL
);

INSERT INTO my_table VALUES
('A',20,1,12),
('B',80,2,11),
('C',40,3, 8),
('D',50,9,10),
('E',20,4, 5),
('F',30,6, 7); 

SELECT * FROM my_table x JOIN my_table y ON y.lft <= x.lft WHERE x.id = 'E';
 ---- ----- ----- ----- ---- ----- ----- ----- 
| id | pct | lft | rgt | id | pct | lft | rgt |
 ---- ----- ----- ----- ---- ----- ----- ----- 
| E  |  20 |   4 |   5 | A  |  20 |   1 |  12 |
| E  |  20 |   4 |   5 | B  |  80 |   2 |  11 |
| E  |  20 |   4 |   5 | C  |  40 |   3 |   8 |
| E  |  20 |   4 |   5 | E  |  20 |   4 |   5 |
 ---- ----- ----- ----- ---- ----- ----- ----- 

SELECT x.*, SUM(y.pct) total FROM my_table x JOIN my_table y ON y.lft <= x.lft WHERE x.id = 'E' GROUP BY x.id;
 ---- ----- ----- ----- ------- 
| id | pct | lft | rgt | total |
 ---- ----- ----- ----- ------- 
| E  |  20 |   4 |   5 |   160 |
 ---- ----- ----- ----- ------- 
1 row in set (0.00 sec)