是否有意义与下面列了一个表创建索引称为user_movies:我应该使用多对多数据库表的索引吗?
USER_ID movie_id
将有比插入或更新此表上的更多的阅读,但我不知道是什么去做。另外:在这种情况下是否可以省略主键?
是否有意义与下面列了一个表创建索引称为user_movies:我应该使用多对多数据库表的索引吗?
USER_ID movie_id
将有比插入或更新此表上的更多的阅读,但我不知道是什么去做。另外:在这种情况下是否可以省略主键?
此表的正确的定义如下:
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中,声明外键或主键隐式地创建索引。是的,这些都是有益的。
我会分别索引两列,是的,你可以消除主键。
或制作复合PK。 – 2010-01-04 23:39:31
如果你正在使用这样的“连接表”,你可能会在你的查询中使用一些连接 - 这些可能会从这两列中每一列的索引中受益(这意味着两个单独的索引) 。
我一直听说,你应该建立在两个列的唯一索引,第一种方式(user_id
+ movie_id
),那么其他的方式(movie_id
+ user_id
)。它在我的应用程序中运行起来稍微快一些(没有太多,大约10-20%),但有一些快速和肮脏的测试。
它也确保你不能有两个行,将相同的movie_id
绑定到相同的user_id
(这可能是好的,但可能并不总是)。
我知道这是旧的,但我不能帮助它:请使用单数名词表名:例如**用户**和*不* **用户** ..和所有DBA欣喜! – dwkd 2015-03-07 07:38:18
@dwkd,感谢您的建议。你可以使用你的命名约定,我会用我的。关于命名约定更重要的是始终遵循它。 – 2015-03-07 19:49:24