#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)