【问题标题】:Nesting of groups or elements组或元素的嵌套
【发布时间】:2011-12-04 09:54:42
【问题描述】:

我是 Mysql 的新手,但我有一些我无法解决的问题。我会给你一个例子来演示它。请注意,我知道(对于当前示例)还有其他更简单、更有效的方法来解决它……但仅将其作为所需程序的示例。

  • 首先是数据:数据是一个人的名字。
创建表人(
          标识 INT,
          名称 VARCHAR(100)
        ) TYPE=innodb;
  • 第二:组创建...所以这相当简单...并且可以使用带有外键的表'group'轻松完成。这些组可以是任意的,包含任意数量的人,重复...或不...(很简单!!)
  • 第三:我真正的问题---我还想要有其他组作为元素的组(而不是persons)。这是真正卡住的地方,因为我知道如何创建一组persons,一组groups(具有自引用外键)......但我不知道如何创建一个组可能有 persons Groups

感谢任何解决此问题的建议。

非常感谢您的 cmets。 问候

组合

【问题讨论】:

    标签: mysql database-design foreign-keys entity-relationship


    【解决方案1】:

    我会先设置 myGroup 和 person 表。

    其次,我会设置一个 myGroupGroup 表,其中包含 myGroupId、parentMyGroupId 列。这将允许您将组行与子组行相关联,即“该组中有这些组”。如果一个组在此表中没有行,则它内部没有子组。

    第三,我会设置一个 personGroup 表,其中包含 personId、myGroupId 列。这将允许您将人员行与给定的组相关联。如果一个组在这个表中没有行,那么它里面没有人。

    CREATE TABLE person(
          id INT UNSIGNED PRIMARY KEY,
          name VARCHAR(100)
        ) ENGINE=innodb;
    
    
    CREATE TABLE myGroup(
          id INT UNSIGNED PRIMARY KEY,
          groupName VARCHAR(100)
        ) ENGINE=innodb;
    
    -- Holds groups within groups
    CREATE TABLE myGroupGroup(
          id INT UNSIGNED PRIMARY KEY,
          myGroupId INT UNSIGNED,
          parentMyGroupId INT UNSIGNED DEFAULT NULL,
          CONSTRAINT `fk_myGroupGroup_group1` FOREIGN KEY (`parentMyGroupId`) REFERENCES `myGroup` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
          CONSTRAINT `fk_myGroupGroup_group2` FOREIGN KEY (`myGroupId`) REFERENCES `myGroup` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
        ) ENGINE=innodb;
    
    -- Holds persons within a group
    CREATE TABLE personGroup(
          id INT,
          personId int UNSIGNED NOT NULL,
          myGroupId int UNSIGNED NOT NULL,
          CONSTRAINT `fk_personGroup_group1` FOREIGN KEY (`myGroupId`) REFERENCES `myGroup` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
          CONSTRAINT `fk_personGroup_person1` FOREIGN KEY (`personId`) REFERENCES `person` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
        ) ENGINE=innodb;
    

    我稍微调整了你的 SQL:

    1) 将TYPE 替换为ENGINE

    2) 将表名 group 替换为 myGroupGROUPreserved word

    祝你好运!

    【讨论】:

    • 亲爱的汤姆,感谢您的 cmets 和解释。关于您的解决方案,我认为存在一个问题(在 ypercube 提出的解决方案上已解决):我可能需要某个组同时拥有人和组成员。无论如何,我非常感谢您的回答。问候。
    • 为了迎合这一点,我打算在 personGroup 表中有一行(用于组中的人员),例如groupId=1, personId=3(所以 groupId 1 里面有 person 3)。在 myGroup 表中,父子关系指示组内的组。所以 id=2, name='group2' 和 parentGroupId=1 来表明组 2 是组 1 的一部分。如果你想做的话,你可以将自引用外键从 myGroup 表移动到 myGroupGroup 表或类似的东西中它更清楚。希望有帮助!
    • 事实上 - 我更喜欢 myGroupGroup 的想法(我认为它更清晰)。我已经相应地修改了我的答案。希望有意义
    • @Tom Mac:我猜你的意思是删除myGroup.parentGroupId 列。
    • @ypercube:我做到了,是的。谢谢 - 好地方(我害怕睡眠不足)。我改变了答案。
    【解决方案2】:

    替代方案:

    CREATE TABLE Entity
            ( EntityId INT                   --- this id could be AUTO_INCREMENT
            , PRIMARY KEY (EntityId)
            ) ENGINE = InnoDB ;
    
    CREATE TABLE Person
            ( PersonId INT                   --- but not this id
            , PersonName VARCHAR(100)
            , PRIMARY KEY (PersonId)
            , FOREIGN KEY (PersonId) 
                REFERENCES Entity(EntityId)        
            ) ENGINE = InnoDB ;
    
    CREATE TABLE Grouping
            ( GroupingId INT                 --- and neither this id
            , GroupingName VARCHAR(100)
            , PRIMARY KEY (GroupingId)
            , FOREIGN KEY (GroupingId) 
                REFERENCES Entity(EntityId)            
            ) ENGINE = InnoDB ;
    
    CREATE TABLE Belongs
            ( EntityId INT
            , GroupingID INT
            , PRIMARY KEY (EntityId, GroupingId)
            , FOREIGN KEY (EntityId) 
                REFERENCES Entity(EntityId) 
            , FOREIGN KEY (GroupingID) 
                REFERENCES Grouping(GroupingId)            
            ) ENGINE = InnoDB ;
    

    【讨论】:

    • 亲爱的 ypercube,谢谢您的回答。这正是我想要的。问候
    • 请注意,此结构将允许循环引用(属于自己的组或属于 B 的组 A 属于...属于 A)
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2015-05-31
    • 2018-10-06
    • 1970-01-01
    • 2011-11-01
    • 2017-01-07
    • 2013-11-22
    • 2011-04-04
    相关资源
    最近更新 更多