代码之家  ›  专栏  ›  技术社区  ›  John

将一个表连接到多个表

  •  2
  • John  · 技术社区  · 15 年前

    我正在建立一个评论系统,人们可以评论上传的文件,信息和待办事项。将comment表连接到其他各种表的最佳方法是什么?
    可能的解决方案
    解决方案一

    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);
    

    什么是最好的解决方案?谢谢你的意见,如果我能澄清什么,请告诉我

    编辑 从中删除表名 因为是复制粘贴错误 关于乔的反应

    1) 所有数据都已转义。我们真的需要看看吗?
    2) $fileId=“146”。

    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)");
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   Joe Stefanelli    15 年前

    就我个人而言,我会把设计规范化一点。可能是这样的:

    alt text

        2
  •  1
  •   Shikiryu DhruvJoshi    15 年前

    多重备注:

    我看到你的问题 在这里,我将使用一种或另一种解决方案:

    CREATE TABLE `comments`(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, // Which is your comment index
    idTable INT NOT NULL, // ID of the message
    table_name enum('files','messages','to-do'), // which it comes from
    user_id INT NOT NULL, // etc...
    comment TEXT NOT NULL);
    

    但也有条件:

    • 的PK 文件夹 信息 _待办事项必须具有相同的格式(INT)
    • 文件夹 , 信息 _要做会很困难的

    2个- 创建连接注释和其他表的表:

    CREATE TABLE `comments`(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, // Which is your comment index
    user_id INT NOT NULL, // etc...
    comment TEXT NOT NULL);
    
    CREATE TABLE `comments-files`(
    id_comments INT NOT NULL PRIMARY KEY,
    id_files INT NOT NULL PRIMARY KEY);
    

    等等。希望你明白这一点。由于 如果需要的话。

        3
  •  0
  •   Donny Kurnia    15 年前

    我只是在我目前的公司学习Ruby on Rails,解决方案1是首选的,因为RoR的活动记录可以将其作为多态关系处理。

    回到主题,您使用的是PHP,我更喜欢解决方案1或3。如果将来有可能将注释表用于其他表,则建议使用解决方案1。

    table_name 不需要列。您可以通过填充来确定注释所在的表 files_id messages_id ,或 to_do_id

        4
  •  0
  •   Nathan MacInnes    15 年前

    我将为每一个可以被评论的东西创建一个连接表,所以一个files_comments表和一个todo_comments表。但解决方案1是另一种选择。我会避免两个或三个解决方案。。。如果未来情况发生变化,可能会变得一团糟。