【发布时间】:2014-08-26 08:52:48
【问题描述】:
情况如下:-
我有一个名为“用户”的表。这包含学生和导师的用户数据,因为所需的大部分数据是相同的。
完成系统后,我现在被告知客户希望能够将学生分配给导师。
是否有一种合法/干净的方式可以在单个表中创建一对多关系,也许是通过链接表?
我已经尝试过思考这个问题,但我想出的任何解决方案似乎都很混乱。
如有任何意见,我将不胜感激。
谢谢
菲尔
【问题讨论】:
标签: sql database database-design erd
情况如下:-
我有一个名为“用户”的表。这包含学生和导师的用户数据,因为所需的大部分数据是相同的。
完成系统后,我现在被告知客户希望能够将学生分配给导师。
是否有一种合法/干净的方式可以在单个表中创建一对多关系,也许是通过链接表?
我已经尝试过思考这个问题,但我想出的任何解决方案似乎都很混乱。
如有任何意见,我将不胜感激。
谢谢
菲尔
【问题讨论】:
标签: sql database database-design erd
您是否尝试过以下方法?
创建一个新表,例如TutorStudent(如果需要,选择一个更合适的名称)。它应该有两列:
Tutor_IDStudent_ID两列都应该是(复合)主键,每一列都是Users 表User_ID 的外键(我假设这就是你所拥有的)。
所以,如果你有一个名叫 Newton 的导师有两个学生,Tesla 和 Edison,你的Users 表就会有一些东西像这样:
您的TutorStudent 表将具有以下值:
相对简单,不需要对现有表格进行任何修改。
删除用户时要小心 - 使用数据库系统的删除级联功能或事后进行一些维护工作,这样您的 TutorStudent 表在更新/删除用户时不会过时。
【讨论】:
我对同样情况的理想
示例:一本书有多个类别:
基本解决方案: book 表记录了图书信息 category 表记录了类别信息,例如:100 个文档 book_category_relation 表有单本书 (book_id) 有 category(category_id) 1 本书可能有 100 个 category_id
理想的解决方案: 首先计算您的类别总数:前 100 个文档。每个类别等于 1 位:最大 31 位,所以 100 个类别我们有 ceil floor(100%31) = 4 个组
category_id = 1 : 1 (1%31) <=> 000000001 group 0 = floor(1/31)
category_id = 2 : 2 (2%31)<=> 000000010 group 0 = floor(2/31)
category_id = 3 : 4 (3%31)<=> 000000100 group 0 = floor(3/31)
category_id = 4 : 8(4%31)<=> 000001000 group 0 = floor(4/31)
...........................
category_id = 31: 2^31(31%31) <=>1000..000 group 0 if moduler 31 equal zero so number group = (31/31 -1)=0;
category_id = 32: 1(32%31) <=> 0000000001 group 1 = floor(32/31)
category_id = 33: 2(33%31) <=> 0000000010 group 1 = floor(33/31)
好的,现在我们在设计手册表中添加 4 个字段 (group_0,group_1,group_2,group_3) 且 int(11) 无符号,并为这些字段添加索引
如果书的类别 id = n,那么我们可以通过以下计算公式:
bit code = (n%31 ==0)?31: (n%31)
number group field = (n%31==0)?(n/31 -1):floor(n/31)
例如:book in category_id = 100 所以:
bit code = (100%31) =7 <=>2^7 = 128,
group = floor(100%31) = 3 <=> in group_3
所以如果您需要查询 category_id = 100 中的所有图书,查询字符串为:
SELECT * FROM book WHERE group_3&128
注意:如果在 where 中按位,MySQL 将无法索引。 但是您可以查看此链接: Bitwise operations and indexes
【讨论】: