多对多的关系数据库

时间:2017-11-07 20:05:01

标签: mysql many-to-many relational

我有一张表格,其中保存了玩家角色信息。我有另一张表,其中保留了所有可能的状态影响。我试图找出如何创建一个关系,其中第一个表中的任何/所有/没有字符条目可以链接到第二个表中的任何/所有/没有状态条目。我的研究告诉我,我可能需要第三个表,可能需要使用复合主键和/或代理键?

所以这是基于回复的更新。我似乎已经完成了我希望实现的目标。这是代码:

    create table characters (
    char_id int primary key auto_increment,
    name varchar(25)
    );

    create table health_status (
    status_id int primary key auto_increment,
    stat_name varchar(15)
    );

    create table char_status (
    char_id int,
    status_id int,
    primary key (char_id, status_id)
    );

    insert into characters (name) values ('Godzilla');
    insert into characters (name) values ('King Kong');
    insert into characters (name) values ('Mecha-Dragon');
    insert into characters (name) values ('Chris Hanson');
    insert into characters (name) values ('Journey');
    insert into characters (name) values ('Lou Diamond Phillips');
    insert into characters (name) values ('RedHot');

    insert into health_status (stat_name) values ('Bleeding');
    insert into health_status (stat_name) values ('Shaken');
    insert into health_status (stat_name) values ('Frightened');
    insert into health_status (stat_name) values ('Petrified');
    insert into health_status (stat_name) values ('Poisoned');
    insert into health_status (stat_name) values ('Slowed');
    insert into health_status (stat_name) values ('Rushed');
    insert into health_status (stat_name) values ('Endowed');

    insert into char_status (char_id, status_id) values (1, 1);
    insert into char_status (char_id, status_id) values (1, 3);
    insert into char_status (char_id, status_id) values (1, 6);
    insert into char_status (char_id, status_id) values (2, 2);
    insert into char_status (char_id, status_id) values (2, 4);
    insert into char_status (char_id, status_id) values (3, 7);
    insert into char_status (char_id, status_id) values (6, 8);
    insert into char_status (char_id, status_id) values (7, 2);
    insert into char_status (char_id, status_id) values (7, 7);

    select characters.name, health_status.stat_name
    from characters
    left join char_status on characters.char_id = char_status.char_id
    left join health_status ON health_status.status_id = 
    char_status.status_id;

我有三个问题。有没有人看到任何方式可以清理,或更好的方式来实现我的目标?另外,表char_status中的复合PK真的有用吗?最后,有没有办法用查询来组织输出,只列出一次字符名称,然后列出所有相关的状态 - 或者这是否适合不同的语言?谢谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

根据您的结构,您说您需要进一步创建新表并将数据放入其中。**

  

为了让你在tableA和TableB之间进行连接,你需要拥有   一个中的主键,以及其他

中的引用

**。多对多的关系就像一个共同的关系,其中tableA依赖于tableB的许多元素,反之亦然。

您可能需要先根据自己的情况对表格进行标准化。

看看Normalization_tuorial 接下来还要看one-many and many-many etc..

答案 1 :(得分:1)

正如您在研究中发现的那样

创建一个包含2个字段的第三个表格,这两个字段将保存那两个表格中的“id”(主要字段),这两个表格要与多个很多很多...

CREATE TABLE `many_to_many` ( `information_id` INT(11) NOT NULL , `status_id` INT(11) NOT NULL , PRIMARY KEY (`information_id`, `status_id`)) ENGINE = MyISAM;

支持依赖于2个字段的PRIMARY KEY。

现在您可以为每个information_id添加许多status_id关系,

和status_id有很多information_id关系。

首次尝试时,运行此查询以添加值以查看

INSERT INTO `many_to_many` (`information_id`, `status_id`) VALUES (1, 1), (1, 2), (2, 1), (2, 2);