Вложенность групп или элементов - PullRequest
2 голосов
/ 10 октября 2011

Я довольно новичок в Mysql, но у меня есть проблема, которую я не могу решить. Я дам вам пример, чтобы продемонстрировать это. Обратите внимание, что я знаю, что (для текущего примера) есть другие более простые и эффективные способы ее решения ... но просто возьмите это в качестве примера требуемой процедуры.

  • Сначала данные: данные будут именем человека.
CREATE TABLE person(
          id INT,
          name VARCHAR(100)
        ) TYPE=innodb;
  • Второе: Создание группы ... Так что это довольно просто ... и это легко сделать, используя таблицу 'group' с чужим ключом к человеку. Эти группы могут быть произвольными, содержать любое количество лиц, дублироваться ... или нет ... (это просто !!)
  • В-третьих: МОЯ НАСТОЯЩАЯ ПРОБЛЕМА --- Я также хотел бы, чтобы в качестве элементов были группы, в которых другие группы (вместо persons). Вот где действительно застряли, потому что я знаю, как создать группы из persons, группы из groups (с внешним ссылочным ключом, который ссылается на себя) ... но я не знаю, как создать группу что МОЖЕТ ИМЕТЬ persons И Groups.

Я ценю любые предложения по решению этой проблемы.

Большое спасибо за ваши комментарии. Привет

ACombo

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Сначала я настрою таблицы 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 на myGroup (GROUP - это зарезервированное слово )

Удачи!

1 голос
/ 10 октября 2011

Альтернатива:

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 ;
...