需要数据库架构设计建议吗?

时间:2014-04-17 14:31:24

标签: mysql sql database database-design

我有一个用户表.. 用户可以有许多子用户..每个子用户可以有一个 子用户数。

User Table.
Id      UserName   other...No of columns.
 1      User1
 2      user2
 3      user1_1
 4      user1_2
 5      user1_2_1
 6      user1_2_2

此处User1_1是User1的子用户 User1_2_2是User1_2的子用户。 这是自我参考表的问题,但在3到4级深。 我想知道谁是特定用户或大师的主人?

group Table.
Id  ,   Owner_userId
1   ,     1
2   ,     4


user_groupTable
 groupId , UserId
   1     ,  3
   1     ,  4
   2     ,  5
   2     ,  6
通过这个我可以实现我的目标。我在徘徊是有最好的方法 解决这个问题? 使用这种方法很难查询可能变得复杂。 请告诉我一个最好的方法,谢谢..

2 个答案:

答案 0 :(得分:2)

如果只有0或1个父母给用户,为什么不使用以下结构

User Table.
Id      UserName   other...No of columns. ParentUserID
 1      User1                             NULL
 2      user2                             NULL
 3      user1_1                           1
 4      user1_2                           1
 5      user1_2_1                         4
 6      user1_2_2                         4
 7      user2_1                           2

这是一个非常简单的方法,你可以通过

获得所有顶级(大师)用户
SELECT * FROM dbo.Users WHERE ParentID = NULL

要获得特定用户的父母,您将可以

SELECT * FROM dbo.Users WHERE ID = *then what ever the parent user ID of the user you are looking at*

要获得树结构,您可以使用递归CTE随意发表评论,如果您希望我发布此额外信息(但请先尝试自己:) :)

祝你好运!

答案 1 :(得分:0)

你可以这样做:

CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) NOT NULL DEFAULT '0',
user_name varchar(32),
.... more columns ...
);

并在此处插入一些数据:

INSERT INTO users VALUES (1,0,'User1');
INSERT INTO users VALUES (2,0,'User2');
INSERT INTO users VALUES (3,1,'User1_1');
INSERT INTO users VALUES (4,1,'User1_2');
INSERT INTO users VALUES (5,4,'User1_2_1');...

创建一个类似的函数:

CREATE FUNCTION f_get_top_user_id (xusers_id INT)
RETURNS text
DETERMINISTIC
BEGIN

DECLARE xtop_id int;
DECLARE xparent_id int;

SELECT u.parent_id INTO xparent_id FROM users u WHERE u.id = xusers_id;
SELECT u.id INTO xtop_id FROM users u WHERE u.id = xusers_id;

WHILE (xparent_id > 0) DO
    BEGIN
        SELECT u.id INTO xtop_id FROM users u WHERE u.id = xparent_id;
        SELECT u.parent_id INTO xparent_id FROM users u WHERE u.id = xparent_id;
    END;
END WHILE;

RETURN xtop_id;

END

如果你把这个功能称为

SELECT f_get_top_user_id(5);

它应该返回1(User1)