在MySQL中为一对多关系选择表

时间:2010-08-21 06:45:10

标签: sql mysql

我想知道我是否允许我的用户选择他们的帖子将显示在哪个类别中,如果我的MySQL表格看起来像下面的表格,他们可以从一个到多个选择多个类别?如果不是我应该添加或删除什么?

这是我的MySQL表格。

CREATE TABLE users_categories (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   category_id  INT UNSIGNED NOT NULL,
   post_id INT UNSIGNED NOT NULL,
   user_id INT UNSIGNED NOT NULL,
   date_created DATETIME NOT NULL,
   PRIMARY KEY (id)
);

CREATE TABLE categories ( 
   id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
   parent_id INT UNSIGNED NOT NULL DEFAULT 0, 
   category VARCHAR(255) NOT NULL, 
   url VARCHAR(255) NOT NULL,
   PRIMARY KEY (id), 
   INDEX parent (parent_id),
   UNIQUE KEY(parent_id, url)
);

CREATE TABLE users (
   user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   username VARCHAR(255) DEFAULT NULL,
   pass CHAR(40) NOT NULL,
   PRIMARY KEY (user_id)
);

CREATE TABLE users_posts (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   user_id INT UNSIGNED NOT NULL,
   title TEXT NOT NULL,
   content TEXT DEFAULT NULL,
   PRIMARY KEY (id)
);

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可能需要考虑将users_categories重命名为posts_categories并删除user_id列:

CREATE TABLE users_categories (
   category_id  INT UNSIGNED NOT NULL,
   post_id INT UNSIGNED NOT NULL,
   date_created DATETIME NOT NULL,
   PRIMARY KEY (category_id, post_id)
);

另请注意,您可能还希望在(category_id, post_id)上使用复合主键,而不是使用surrogate key。这个主键可以唯一地标识每个关系,另外还可以保证没有帖子多次链接到同一个类别。

答案 1 :(得分:0)

    user_id中的
  • users_categories是重复的;帖子已经与用户关联,并且该类别与帖子相关联。因此,传递上,帖子和用户之间已经存在连接。

  • users_categories不需要id,因为它是一个映射表,应该命名为posts_categories

  • users_categories字段date_created不太可能有用,可能是个错误。

  • users_posts应该命名为posts

  • 在适用的情况下使用外键约束。

其余的看起来很好。