Php 如何在多个表上设置一个FK(外键)?

Php 如何在多个表上设置一个FK(外键)?,php,mysql,database,Php,Mysql,Database,我有几个帖子表和一个投票表。如何防止在投票表的Posts表中插入不存在的post_id 应当指出,实际上员额表的结构是不同的。所有POST表的结构都不相同,因此我无法将所有POST表合并为一个表 现在我想防止在投票表中插入无效行。无效=无post表中不存在post_id 因此,如果我只有一个表,我可以在vots.post_id引用Posts.id上创建一个外键,但问题是有几个Posts表。好吧,有什么建议吗?桌子的结构太疯狂了。您需要有一个帖子索引表,它将所有帖子合并到一个地方,并给出如下结果:

我有几个帖子表和一个投票表。如何防止在投票表的Posts表中插入不存在的post_id

应当指出,实际上员额表的结构是不同的。所有POST表的结构都不相同,因此我无法将所有POST表合并为一个表

现在我想防止在投票表中插入无效行。无效=无post表中不存在post_id


因此,如果我只有一个表,我可以在vots.post_id引用Posts.id上创建一个外键,但问题是有几个Posts表。好吧,有什么建议吗?

桌子的结构太疯狂了。您需要有一个帖子索引表,它将所有帖子合并到一个地方,并给出如下结果:

// Posts_Index
+----+---------+------------+
| id | post_id | post_table |
+----+---------+------------+

// Votes
+----+---------+
| id | post_id |
+----+---------+

否则,您需要反向映射路径。因此,post\u id->vows.id.

一个解决方案可以是,您在投票表中使用post\u table\u ref来标识该帖子是从哪个表中投票的。对于整个应用程序,此post_表_ref必须固定

根据帖子来自的表,您必须在投票更新查询中提供post\u table\u ref


例如:如果帖子来自post_table_01,则必须在投票更新查询中将post_table_ref设置为1。在从投票表获取记录时,您将在SELECT from VOUTES查询的WHERE子句中使用相同的post_table_ref

您不能在这个数据结构中引用,因为您没有一个主键可以引用,但是有三个主键可以在不同的表中多次引用相同的值

对每个POST表格使用FK列可以使您的投票引用非POST表格或多个POST表格

如果你真的需要3个或更多不同的post表,你可以用PK创建一个中心post_基表,让其他post表引用它

表1:U基数:

Id int primary key,
-- possibly other common data
然后将posts_uubase.Id作为FK提供给posts_uutables,并让vots.post_uid引用posts_ubase.Id

另外,先读一些关于关系数据库设计的书;创建包含某些内容的表相当容易,但如果不知道外键、规范化等,数据库很快就会变成一个混乱的垃圾堆,既不能满足性能要求,也不能满足数据完整性要求


或者,如果您不需要它,或者希望在开始时自己编写代码比学习关系数据库设计更容易,但以后会遇到麻烦,那么可以转到NoSQL,在那里您只需将帖子作为文档转储,并在提交时向这些文档添加投票,这样它们就永远不会成为孤立的文档。

@Sajad我也有相同的模型。我是那样做的这很有趣,您使用微笑形状作为代码@Sajad Hacking Smileys.oh只有一件事,对于创建Posts\u索引表,有什么特别的方法吗?或者我应该按正常方式创建它?视图更好。您能解释一下此解决方案与我的解决方案有何不同吗?我的解决方案不需要额外的表,因此服务器上的资源密集度更低,更新和选择查询也会更简单。这两种解决方案都是相同的。您的解决方案很好,但有点重复。但是有一些小的区别,比如你的列名比Praveen Kumar的答案有更多的参考-只是kedding,无论如何谢谢你的关注,还有+1 upvote给你。我的问题是如何防止插入不存在的帖子id?
Id int primary key,
-- possibly other common data