情况如下: -
我有一个名为Users的表。这包含学生和导师的用户数据,因为大多数所需数据都是相同的。
完成系统后,我现在被告知客户希望能够将学生分配给导师。
我是否可以通过链接表在单个表中创建一对多的关系?
我试过这个想法,但无论我提出什么解决方案似乎都很混乱。
如果有任何意见,我将不胜感激。
由于
菲尔
答案 0 :(得分:3)
您是否尝试过以下方法?
创建一个新表,例如TutorStudent
(如果需要,选择一个更合适的名称)。它应该有两列:
Tutor_ID
Student_ID
两列都是(复合)主键,每列都是Users
表User_ID
的外键(我假设这就是你所拥有的)。
所以,如果你有一个名为 Newton 的导师有两个学生, Tesla 和 Edison ,你的Users
表将会有这样的事情:
并且您的TutorStudent
表格将包含以下值:
相对简单,不需要对现有表格进行任何修改。
删除用户时要小心 - 使用数据库系统的删除级联功能或之后进行一些维护工作,以便在更新/删除用户时TutorStudent
表格不会过时。
答案 1 :(得分:0)
我对相同情况的理想选择
示例:一本书有很多类别:
基本解决方案: book 表记录了图书信息 类别表已归类了类别信息,例如:100个文档 book_category_relation 表具有一本书(book_id)具有category(category_id)1本书可能具有100 category_id
理想的解决方案: 首先计算您的总类别:ex 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)
ex:图书类别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
注意:如果在位按位,MySQL不能索引工作。 但是您可以检查此链接: Bitwise operations and indexes