【问题标题】:Architecture for user-tests / group-tests用户测试/组测试的架构
【发布时间】:2011-08-30 13:13:45
【问题描述】:

我有一个用户可以执行测试的用例。这是基于邀请。因此管理员可以向用户发送邀请以执行选定的测试。也可以创建一个由多个用户组成的团队并向团队的所有用户发送邀请以执行该团队的测试。

创建这些模型有多种选择,但我不确定最好的方法是什么(或者甚至可能有替代方法)。

选项 1

  • 用户:ID、姓名
  • 团队:ID、名称
  • UserTeam:user_id、team_id
  • UserInvite: id, user_id
  • TeamInvite:id,team_id
  • 测试:id、user_id、user_invite_id(可以为null)、team_invite_id(可以为null)、类型[user|team]

选项 2

  • 用户:ID、姓名
  • 团队:ID、名称
  • UserTeam:user_id、team_id
  • 邀请:id、user_id(可为 null)、team_id(可为 null)、类型 [user|team]
  • 测试:id、user_id、invite_id

因此,最好有单独的邀请(针对团队和用户)并将测试链接到团队邀请或用户邀请(如选项 1)。或者替代方案:有一个邀请,然后确定它是链接到团队还是用户(如选项 2)?

【问题讨论】:

    标签: php mysql model-view-controller architecture model


    【解决方案1】:

    就个人而言,我会选择你的第二个选项。

    不过,您可能还想研究第三个选项。它可以存储发送给多个团队和用户的邀请:

    user: id, name
    team: id, name
    invite: id
    test: id, invite_id
    user_invite: invite_id, user_id
    team_invite: invite_id, team_id
    

    【讨论】:

    • 我喜欢您的第三个选项,因为它进一步抽象了模型。我需要测试额外连接对最常用查询的性能影响:是否有来自邀请 X 的测试未由团队中的用户完成?根据邀请的时间戳(而不是测试),您的最新测试结果是什么。如果性能可以忽略不计,我会选择选项 3。否则我会坚持我认为的数字 2。
    • 选择这个作为最终答案,因为在ypercube的提议下,没有伴随用户的团队就无法存在。我们的用户和团队数据库表在多个地方使用,这将导致完整的代码重构。谢谢你们俩的帮助。
    【解决方案2】:

    您还可以将Team 定义为特殊的User,其中Team.id 既是Primary Key,又是Foreign KeyUser.id。您的表格将如下所示:

    Option 3
    
        * User: id, name                    --- User data
        * Team: id, name                    --- Team data (name field can be dropped)
        * UserTeam: user_id, team_id        --- User belongs to Team
        * Test: id, description             --- Test definition
        * Invite: id, user_id, test_id      --- Invitation for User to make Test
        * TestDone: id, user_id, invite_id  --- TestDone after User accepted Invitation
    

    所以所有团队也将成为用户。

    在重新阅读了您对此部分的描述后,我略微更改了测试邀请。


    示例脚本:

    CREATE TABLE user
    ( id int NOT NULL AUTO_INCREMENT
    , name VARCHAR(20) NOT NULL
    , PRIMARY KEY (id)
    ) ;
    
    CREATE TABLE team
    ( id int NOT NULL
    , teamname VARCHAR(20) NOT NULL
    , CONSTRAINT PK_team_id
        PRIMARY KEY (id)
    , CONSTRAINT FK_team_id_TO_user_id
        FOREIGN KEY (id)
          REFERENCES user(id)
    ) ;
    
    INSERT INTO user
    VALUES
      (1, 'John')
    , (2, 'George')
    , (3, 'Mary' )
    , (4, 'Team-1')  ;
    
    SELECT * FROM user ;
    
    | id | name   |
    | 1  | John   |
    | 2  | George | 
    | 3  | Mary   |    
    | 4  | Team-1 |       
    
    INSERT INTO team
    VALUES
     (4, 'Team-One') ;
    
    SELECT * FROM team ;
    
    | id | teamname |  
    | 4  | Team-One | 
    
    INSERT INTO team
    VALUES
     (5, 'Team-Two') ;
    
    > Cannot add or update a child row: a foreign key constraint fails
    > (`test/team`, CONSTRAINT `FK_team_id_TO_user_id` FOREIGN KEY (`id`)
    > REFERENCES `user` (`id`))
    

    【讨论】:

    • 您说团队有可能有一个主键同时是用户主键的外键?我从来没有使用过这个想法,但如果你说这可以将邀请链接到同一个团队/用户,这可能是一个理想的情况。我不确定这是否适用于 MySql,但我需要对此进行测试。
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多