我正在创建一个数据库表,并且没有为其分配逻辑主键.所以,我正考虑在没有主键的情况下离开它,但我对此感到有点内疚.我是不是该?
每个表都应该有一个主键吗?
我的项目和开发人员计划有以下结构:
developer table
id
developer name
etc...
project table
id
project name
etc...
developer _project table
???
Run Code Online (Sandbox Code Playgroud)
因为开发人员可以在多个项目中,并且项目可以有多个开发人员,所以我必须创建一个新表,但从我读到的是他们不知道我应该使用什么ID.
如果我使用id自动增量+ user_id + project_id,我会重复,因为id是主键吗?
这是我的表:
CREATE TABLE group_edits (
vfile_id bigint(20) unsigned NOT NULL,
editor_id int(10) unsigned NOT NULL,
edits text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
没有唯一索引,因为一个editor_id可以编辑多个vfile_id,也可以通过多个editor_id编辑一个vfile_id.
phpMyAdmin 4.1.6不允许我编辑这个表说:
Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.
Run Code Online (Sandbox Code Playgroud)
现在它让我觉得这样的桌子有什么问题吗?当您获取editor_id和vfile_id的值时,行是唯一的,而单独的列都不是唯一的.
我知道要修复它我可以添加
`ID` int(11) NOT NULL AUTO_INCREMENT,
Run Code Online (Sandbox Code Playgroud)
但它并不反映我的数据库架构的设计,我想避免添加技巧只是为了使phpMyAdmin工作.
我的数据库设计是错误的还是phpMyAdmin?
只是一个快速的数据库设计问题:你是否总是在每张表中使用ID字段,或者只是大部分?显然,您的大多数表都会受益,但是您是否曾经有过可能不想使用ID字段的表格?
例如,我想添加向另一个表(foo)中的对象添加标签的功能.所以我有一个带有varchar字段的表FooTag来保存标记,还有一个fooID字段来引用foo中的行.我真的需要围绕一个基本上任意的ID字段创建聚簇索引吗?使用fooID和我的文本字段作为聚集索引会不会更有效率,因为我几乎总是会通过fooID进行搜索?另外,使用聚集索引中的文本可以保持数据的排序,使我在查询数据时更容易排序.缺点是插入需要更长时间,但不会被选择期间的增益所抵消,这种情况会更频繁地发生?
您对ID字段有何看法?可弯曲的规则,还是坚不可摧的法律?
编辑:我知道提供的示例未规范化.如果标记是项目的主要部分,标记了多个表,以及其他"附加",那么双表解决方案将是一个明确的答案.但是在这个最简单的情况下,归一化是否值得?它会节省一些空间,但在运行查询时需要额外的连接
这个问题与 MySQL表需要一个ID有关吗?
有一个无意义的auto_incremental ID作为表的PRIMARY KEY,然后当我创建其他KEY时,我应该在KEY中包含这个ID吗?
例如,在此表中:
CREATE TABLE `location` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(50),
`states` varchar(50),
`city` varchar(50),
`county` varchar(50),
`zip` int(5),
PRIMARY KEY(ID),
KEY zip1 (zip),
KEY zip2 (zip, ID)
} ENGINE=InnoDB ;
Run Code Online (Sandbox Code Playgroud)
因为我需要使用邮政编码搜索表格,所以我需要一个从邮政编码开始的KEY.我应该使用KEY zip1或KEY zip2.这两个KEY中哪一个更好?