日期:2014-05-20  浏览次数:20650 次

逻辑上有点混乱,希望达人指点(主要是数据库的设计上,由一个用户一组变为一用户多组时有点乱了...)
首先,感谢您能看这个帖子,这个帖子有点长,但我已经尽量在简化了,但依然很长.希望您能看完,然后给点建议,多谢了!!!

为了方便表述和理解起来容易一些,我以程序中的三个功能界面作为描述点吧

【创建用户界面】:功能是管理员可以创建一些用户信息
-创建用户-表结构如下->
id userid groupid 
1 张三 10001
2 李四 10001
3 王五 10003
4 马六 10004

【创建组界面】该界面的功能就创建一些组。上个界面(创建用户界面)创建用户时会为用户指定属于哪个组,而那些组的来源就是在这个界面中添加的。
举个例子,当管理员创建用户的时候,界面上有个dropdownlist控件用来选择不同的组(而dropdownlist中的内容,就是该界面添加进去的一些组名)
-创建组-的表结构如下->

id gourpid groupName
1 1 1组
2 2 2组
3 3 3组
4 4 4组

【用户录入信息界面】
管理员创建一些用户以后,这些用户就可以登录系统(张三、李四等人登录该系统),他们可以录入一些信息,同时也能看到【同组】的人录入的信息(比如张三和李四都能看到彼此的录入记录,因为他们同在10001组)。

-录入信息-表结构如下
id information userid groupid
1 客户1的名字 1 10001
2 客户2的名字 1 10001
3 客户3的名字 2 10001
4 客户4的名字 4 40001

好了 基本的描述已经说完了 下面是提出的一些问题
—————————————————————————————————————————————————————————————————
如果单纯是一个用户只属于一个组,那上面这些逻辑方面已经很清楚了。

【但是现在需求变了,一个用户一个组要变为一个用户多个组】,比如 马六同时在1~4组中,那么马六就可以同时看到张三 李四 王五的信息(因为他们三个人所在的组马六是都有的)

这个需求的变化,从界面上很容易设计,既在创建用户的时候,可以用checklistbox来为用户选择多个组。
【但是数据库中的表应该怎么设计呢?】难道要设计成下面这样?(不同的组用逗号分开)

id userid groupid 
1 张三 10001
2 李四 10001,10003
3 王五 10001,10003
4 马六 10001,10002,10003,10004

录入信息的表难道也要设计成如下这样?
id information userid groupid
1 客户1的名字 1 10001
2 客户2的名字 1 10001
3 客户3的名字 2 10001,10003
4 客户4的名字 4 10001,10002,10003,10004

这样做的话,用户的录入和读取方面就太麻烦了(方法是通过对groupid处理 以逗号split进行分割 然后用sql语句查询的时候用 where gourpid=10001 or gourpid=10002等等)

但是还存在一个问题,就是当管理员如果想【删除一些组】,那么 用户表 和 录入表中应该怎么办呢? 例如管理员删除掉了10002和10003组 ,然后用户表和录入表要都update一下groupid列的值,将groupid值中带有10002和10003都替换成空格????
我觉得这样做太麻烦了,希望大牛们帮忙解惑,应该是数据库设计方面出了问题,应该怎么做合理呢????????

------解决方案--------------------
id userid groupid
1 张三 10001
2 李四 10001
3 李四 10003
4 王五 10001
5 王五 10003
6 马六 10001
7 马六 10002
8 马六 10003
9 马六 10004

以这种方式
------解决方案--------------------
再加个user_group表不就可以了?

user表, user_group表, group表
a a 1组 1组
b a 2组 2组
c a 3组 3组
b 1组
c 2组

删除的时候就把 group 和 user_group 关联数据删除就可以了。
------解决方案--------------------
探讨
-录入信息-表结构如下
id information userid groupid
1 客户1的名字 1 10001
2 客户2的名字 1 10001
3 客户3的名字 2 10001
4 客户4的名字 4 40001

好了 基本的描述已经说完了 下面是提出的一些问题
—————————————————————————————————————————————————————————————————
如果单纯是一个用户只属于一个组,那上面这些逻辑方面已经很清楚了