【发布时间】:2011-05-07 06:42:42
【问题描述】:
我正在构建一个评论系统,人们可以在其中评论上传的文件、消息和待办事项。将注释表连接到其他各种表的最佳方法是什么?
可能的解决方案
解决方案一 - 使用两个字段的外键。
CREATE TABLE `comments`(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
foreign_key INT NOT NULL,
table_name enum('files','messages','to-do'),
user_id INT NOT NULL,
comment TEXT NOT NULL);
解决方案二 - 每个表都有一个数据库唯一的主键。所以我会使用 php 的 uniqid($prefix) 作为每个表的主键。
CREATE TABLE `comments`(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
foreign_key char(23) NOT NULL,
table_name enum('files','messages','to-do'),
user_id INT NOT NULL,
comment TEXT NOT NULL);
解决方案三 - 注释表中有多个外键
CREATE TABLE `comments`(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
files_id INT NOT NULL,
messages_id INT NOT NULL,
to_do_id INT NOT NULL,
user_id INT NOT NULL,
comment TEXT NOT NULL);
什么是最好的解决方案?感谢您的意见,如果我能澄清任何事情,请告诉我
EDIT 从解决方案三 中删除了 table_name,因为它是一个 copy_paste 错误 关于乔的回应
假设:
1)所有数据都已经转义。我们真的需要看到吗?
2) $fileId = "146"。
3) $userId = "432"。
4) $comment = "Stackoverflow 太棒了!"
插入
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO `comments` (user_id,comment) VALUES($userId,$comment)");
$commentId = mysql_insert_id();
mysql_query("INSERT INTO `comments_files_xref` (file_id,comment_id) VALUES($fileId,$commentId)");
【问题讨论】:
标签: php mysql database-design foreign-keys foreign-key-relationship