2014-10-01 24 views
1

我正在用PHP和MySQL构建项目管理项目。我决定添加论坛类型讨论部分。我正在计划它与典型的论坛类似,但不是由不同的论坛主题/部分组成,而是由项目ID取代,因此我的项目管理软件中的每个项目都将拥有它自己的论坛部分。我的MySQL数据库表上的这个外键会为我做什么?

所以我真正需要的是一个主题帖子,然后是一个帖子回复。每个主题都会有一个主题/标题,然后身体/说明和任何跟进的帖子/答复将“信息”

所以我建立主题帖子 MySQL数据库表

我的架构在下面。现在我有多年与这些数据库的工作,但我没有太多的经验与更多的花哨功能,如外键

所以我有这样的外键SQL ...

ALTER TABLE posts 
ADD FOREIGN KEY(parent_topic_id) 
REFERENCES topics(topic_id) 
ON DELETE CASCADE 
ON UPDATE CASCADE; 

1)如上所述,这里没有太多的经验,所以我的问题是这个外键究竟会做什么,并防止发生?我有没有使用它有什么区别?

请问ON DELETE CASCADE意味着我可以从topics表中删除一条记录,它会自动删除我的posts表具有匹配topic_id所有记录?如果是这样,真的很不错,值得添加它。

我不确定ON UPDATE CASCADE在这种情况下会做什么?

2)如果从我像这样的PHP代码创建了我的数据库表...

$DiscussionPostsTableSql = "CREATE TABLE posts (
    ALL my COLUMN DEFINITIONS HERE....)"; 
$db->query($DiscussionTopicReplyTableSql); 

那么我应该能够创造同样的方式和本外键?像这样...

$foreignKeySql = "ALTER TABLE posts ADD FOREIGN KEY(parent_topic_id) REFERENCES topics(topic_id) ON DELETE CASCADE ON UPDATE CASCADE;)"; 
$db->query($foreignKeySql); 

或者是否需要以某种其他方式添加?


主题表

CREATE TABLE topics (
    topic_id char(36) NOT NULL AUTO_INCREMENT, 
    project_id char(36) NOT NULL, 
    topic_subject VARCHAR(255) NOT NULL, 
    topic_content TEXT default NULL, 
    date_created DATETIME NOT NULL, 
    date_last_post DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    last_post_user_id char(36) NOT NULL, 
    posts_count char(36) default NULL, 
    PRIMARY KEY (topic_id) 
) TYPE=INNODB; 

帖子表

CREATE TABLE posts (
    post_id char(36) NOT NULL AUTO_INCREMENT, 
    parent_topic_id char(36) NOT NULL, 
    post_content TEXT NOT NULL, 
    date_created DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    PRIMARY KEY (post_id) 
) TYPE=INNODB; 

外键

// Add Foreign Key between Topic and Posts tables 
ALTER TABLE posts 
ADD FOREIGN KEY(parent_topic_id) 
REFERENCES topics(topic_id) 
ON DELETE CASCADE 
ON UPDATE CASCADE; 

回答

1

这个外键会阻止系统与parent_topic_id不指向任何topic_idtopics表,无论是由错误或恶意创建posts

ON DELETE CASCADE表示无论何时删除topic,所有相关的posts都将随之删除。

ON UPDATE CASCADE意味着如果您更新topic的ID,它将更新所有引用posts的ID。

至于创建密钥 - 如您所述,您应该创建它在创建表本身的相同位置/时尚。

注: 各种存储引擎对外键支持有各种限制。您正在使用的InnoDB是一个非常安全的选择,但您应该查看the documentation以获取完整的详细信息。

+0

的信息,我只是想确保我在正确的轨道上。另外,在查看我看到的内容后,我可以在创建表语句中创建外键非常酷 – JasonDavis 2014-10-01 05:42:05

1

外键关系是规范化方法的一部分。

在这里,如果您不使用单独的表格进行发布和主题重复会来像一个主题将有多个帖子。

在这里,您有针对帖子和主题以及通过外键关系发布帖子的连接主题的单独表格。

以这种方式,您可以管理这两个表。删除主题将删除与该主题相关的所有帖子。

相关问题