2010-01-04 47 views

回答

8

此表的正确的定义如下:

CREATE TABLE user_movies (
    user_id INT NOT NULL, 
    movie_id INT NOT NULL, 
    PRIMARY KEY (user_id, movie_id), 
    FOREIGN KEY (user_id) REFERENCES users(user_id), 
    FOREIGN KEY (movie_id) REFERENCES movies(movie_id) 
) ENGINE=InnoDb; 

通知“主键”是一种约束,不是列。在每个表中使用主键限制是最佳做法。不要将主键约束与自动生成的pseudokey列混淆。

在MySQL中,声明外键或主键隐式地创建索引。是的,这些都是有益的。

+0

我知道这是旧的,但我不能帮助它:请使用单数名词表名:例如**用户**和*不* **用户** ..和所有DBA欣喜! – dwkd 2015-03-07 07:38:18

+1

@dwkd,感谢您的建议。你可以使用你的命名约定,我会用我的。关于命名约定更重要的是始终遵循它。 – 2015-03-07 19:49:24

1

我会分别索引两列,是的,你可以消除主键。

+1

或制作复合PK。 – 2010-01-04 23:39:31

0

如果你正在使用这样的“连接表”,你可能会在你的查询中使用一些连接 - 这些可能会从这两列中每一列的索引中受益(这意味着两个单独的索引) 。

1

我一直听说,你应该建立在两个列的唯一索引,第一种方式(user_id + movie_id),那么其他的方式(movie_id + user_id)。它在我的应用程序中运行起来稍微快一些(没有太多,大约10-20%),但有一些快速和肮脏的测试。

它也确保你不能有两个行,将相同的movie_id绑定到相同的user_id(这可能是好的,但可能并不总是)。

相关问题