【问题标题】:One to many relationship on the same table同一张表上的一对多关系
【发布时间】:2014-08-26 08:52:48
【问题描述】:

情况如下:-

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

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

是否有一种合法/干净的方式可以在单个表中创建一对多关系,也许是通过链接表?

我已经尝试过思考这个问题,但我想出的任何解决方案似乎都很混乱。

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

谢谢

菲尔

【问题讨论】:

    标签: sql database database-design erd


    【解决方案1】:

    您是否尝试过以下方法?

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

    • Tutor_ID
    • Student_ID

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

    所以,如果你有一个名叫 Newton 的导师有两个学生,TeslaEdison,你的Users 表就会有一些东西像这样:

    • 用户 ID、名称
    • 1,牛顿
    • 2,特斯拉
    • 3、爱迪生

    您的TutorStudent 表将具有以下值:

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

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

    删除用户时要小心 - 使用数据库系统的删除级联功能或事后进行一些维护工作,这样您的 TutorStudent 表在更新/删除用户时不会过时。

    【讨论】:

    • 太棒了!非常感谢 Darioo - 这正是我所希望的 ;-)
    • 你好,我现在实际上和 OP 有同样的问题!我正在使用这种设计,但它似乎不能保证 ONE-MANY 关系。例如,(1,2) (1,3) (4,3) (2,2) 的表是有效的: (
    • @Zanko 上面有什么解决方案吗? IMO 一种解决方案可以是从应用程序中处理上述问题。
    【解决方案2】:

    我对同样情况的理想

    示例:一本书有多个类别

    基本解决方案: 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 2013-02-17
      • 2012-08-27
      • 2020-09-09
      • 1970-01-01
      • 2015-11-12
      • 2014-07-11
      相关资源
      最近更新 更多