同一桌上的一对多关系

时间:2014-08-26 08:52:48

标签: sql database database-design erd

情况如下: -

我有一个名为Users的表。这包含学生和导师的用户数据,因为大多数所需数据都是相同的。

完成系统后,我现在被告知客户希望能够将学生分配给导师。

我是否可以通过链接表在单个表中创建一对多的关系?

我试过这个想法,但无论我提出什么解决方案似乎都很混乱。

如果有任何意见,我将不胜感激。

由于

菲尔

2 个答案:

答案 0 :(得分:3)

您是否尝试过以下方法?

创建一个新表,例如TutorStudent(如果需要,选择一个更合适的名称)。它应该有两列:

  • Tutor_ID
  • Student_ID

两列都是(复合)主键,每列都是UsersUser_ID的外键(我假设这就是你所拥有的)。

所以,如果你有一个名为 Newton 的导师有两个学生, Tesla Edison ,你的Users表将会有这样的事情:

  • User_ID,名称
  • 1,Newton
  • 2,特斯拉
  • 3,爱迪生

并且您的TutorStudent表格将包含以下值:

  • Tutor_ID,Student_ID
  • 1,2
  • 1,3

相对简单,不需要对现有表格进行任何修改。

删除用户时要小心 - 使用数据库系统的删除级联功能或之后进行一些维护工作,以便在更新/删除用户时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