如何关联两个MySQL表中的数据?

时间:2012-11-12 16:50:43

标签: mysql sql database database-design

我正在设计一个基本上必须存储两种元素的网络应用程序:帖子和容器(帖子数组)

我已经完成了数据库,以便在容器的每一行中存储它所拥有的帖子数组的字符串化版本。

问题是当每次调用容器时删除帖子我都有帖子的ID,我必须检查帖子是否有效。

有更好的方法吗?例如,构造容器表以保存实际帖子的“指针”?

非常感谢!

5 个答案:

答案 0 :(得分:2)

如果我理解正确,你就有一对多关系:每个容器可以有很多帖子,但每个帖子都与一个容器有关。所以你的数据库设计应该反映这一点。

示例:

create table tbl_containers (
    containerId int unsigned not null auto_increment primary key,
    containerDescription varchar(100)
);
create table tbl_posts (
    postId int unsigned not null auto_increment primary key,
    containerId int unsigned not null,
    postText varchar(100),
    index idxContInd(containerId)
);

填写数据时,每个帖子都必须与容器相关联;换句话说,在输入帖子之前必须有一个容器来容纳它,如果没有“合适”的容器,则应该在创建帖子之前创建

您的数据在表格中后,很容易查找帖子并删除它们,与每个帖子所属的容器无关。

希望这有助于你

答案 1 :(得分:2)

使用两个表之间的外键关系是理想的。

首先,如果我正确理解了您的数据之间的关系,那么您的Container表将是包含与唯一ID相关的信息的表。然后`Posts表有自己唯一的id,containerId和post内容本身。

抽出来,它看起来有点像这样。

Container
---
id

Posts
---
id | containerId | post

ContainerPosts之间的关系被认为是一对多;也就是说,一个容器可能有很多帖子,但是一个帖子不能属于许多容器。如果您想要这种关系,则可能需要为Posts添加另一列。

答案 2 :(得分:1)

这里回答我的评论,收到一些积极的反馈:)尽管你已经有答案了。

您的容器将保留帖子。所以它就像一个篮子里面装着许多物品。 所以对于每个帖子,都有一个容器ID。对于容器表 - 容器ID是主键。帖子表 - 帖子ID是主键。要拥有外键关系,请在posts表中将容器ID设置为外键。如果这令人困惑 - 请参阅下面的表格架构。如果您希望在删除容器时删除与容器相关的任何帖子,您可以在父键(外键)上使用ON CASCADE DELETE删除任何孤儿(没有父母的孩子)。 如果您希望自动增加ID,可以使用AUTO_INCREMENT,否则只需删除它。

请查看sql syntax以获得进一步的理解。

CREATE TABLE tblParent (
    `CID` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `field2` varchar(100),
    `field3` varchar(100)
);

CREATE TABLE tblchild (
    `PID` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `PCID` int NOT NULL,
    `field2` varchar(100),
    `field3` varchar(100),
    FOREIGN KEY REFERENCE tblParent ('CID')
    ON DELETE CASCADE
);

答案 3 :(得分:0)

我不确定我是否理解正确但我会反过来这样做:你有一个POST表,它有一个名为container_ID的字段。如果帖子被删除,那么POST表中的一行将被删除(包括指向container_ID中其父实体的指针)。在这种情况下,您可以在表之间创建外键关系,以保持数据的一致性和数据库中的关系完整。请澄清我是否误解了某些事情。

答案 4 :(得分:0)

您可以创建第二个表,其中包含两个字段,例如'container_id'和'post_id'。 然后,当您删除帖子时,删除包含post_id的所有条目,对容器删除相同的内容。确保表primary_key由two_field组成,以避免条目重复。