如何在 [mysql] DBMS 中存储基于树的分层数据?
How to store the tree based hierarchical data in [mysql] DBMS?
用户组:
用户 1 创建用户 2,3,4。
用户 2 创建用户 5、6、7。
用户 6 创建用户 8,9,10,...等
终于,用户1可以管理所有用户了。 6可以管理8,9,10。
我打算这样存,
user - created_by
2 - 1
3 - 1
4 - 1
5 - 2
这是在 MySQL 数据库中存储数据的正确方法吗?
任何人都可以帮助我改进这个数据库结构。谢谢。
这可能不是最好的解决方案,但您可以创建一个代表父树的属性 hierarchy
。
例如,用户 1 创建用户 2,用户 2 创建用户 3,则用户 3 的该属性的值为:“1,2”
因此 table 将如下所示:
| id | hierarchy |
|----|-----------|
| 1 | NULL |
| 2 | "1" |
| 3 | "1,2" |
| 4 | "1,2" |
如果我们要检索由 user1 管理的所有用户:
SELECT * FROM users WHERE FIND_IN_SET("1",hierarchy) > 0
如果我们要检索管理用户 3 的所有用户:
SELECT * FROM users WHERE FIND_IN_SET (id, SELECT hierarchy FROM users WHERE id = 3) > 0
当然,解决方案是有限的,特别是如果您想进行复杂的查询,我建议您选择 XML 方法。当你的数据看起来像一棵树时会更好
用户组:
用户 1 创建用户 2,3,4。
用户 2 创建用户 5、6、7。
用户 6 创建用户 8,9,10,...等
终于,用户1可以管理所有用户了。 6可以管理8,9,10。
我打算这样存,
user - created_by
2 - 1
3 - 1
4 - 1
5 - 2
这是在 MySQL 数据库中存储数据的正确方法吗? 任何人都可以帮助我改进这个数据库结构。谢谢。
这可能不是最好的解决方案,但您可以创建一个代表父树的属性 hierarchy
。
例如,用户 1 创建用户 2,用户 2 创建用户 3,则用户 3 的该属性的值为:“1,2”
因此 table 将如下所示:
| id | hierarchy |
|----|-----------|
| 1 | NULL |
| 2 | "1" |
| 3 | "1,2" |
| 4 | "1,2" |
如果我们要检索由 user1 管理的所有用户:
SELECT * FROM users WHERE FIND_IN_SET("1",hierarchy) > 0
如果我们要检索管理用户 3 的所有用户:
SELECT * FROM users WHERE FIND_IN_SET (id, SELECT hierarchy FROM users WHERE id = 3) > 0
当然,解决方案是有限的,特别是如果您想进行复杂的查询,我建议您选择 XML 方法。当你的数据看起来像一棵树时会更好