我被提及我需要并自动递增id以跟踪唯一记录... ... ...基本上......指向自动递增int的PRIMARY KEY
我可以看到这一点,因为用户数据是可变的..更改...如果你给每一行ID,它可以作为一种更好地跟踪用户并且不占用太多空间的方法 - 4个字节。
我也听说INDEX字段用作加速搜索的方法..
如果我有一组用户属性说A1, A2, A3
,并且我有一个主键P,定义为int I ... INDEX如何与此相关?我该如何正确实施?
列 -
int, varchar, varchar, varchar,....Primary Key, Index ?
I, A1, A2, A3..., P, ?
答案 0 :(得分:1)
在MySQL中:
因此,在您的示例中I
将被声明为
CREATE TABLE (
I int NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (I)
...
但是,这是一个“代理”密钥,因为它不是自然密钥(例如员工编号),所以你也有一个独特的索引(或密钥)
CREATE TABLE ( ...
EmployeeNumber char(7) NOT NULL,
...
UNIQUE KEY (EmployeeNumber)
...
根据在JOIN和WHERE中的使用,将在单个列或列组合上创建其他索引,但索引策略通常与为表选择主键分开。
答案 1 :(得分:0)
听起来你有1:M的关系,因为用户可以有很多属性。我建议使用外键将属性存储到用户表中的第二个表:
create table `user` (
`id` int(11) unsigned not null auto_increment,
`first_name` varchar(60) not null,
primary key (`id`)
)engine=InnoDB default charset=utf8;
create table `user_attribute_link` (
`id` int(11) unsigned not null auto_increment,
`user_id` int(11) unsigned not null,
`attribute_id` int(11) unsigned not null,
primary key (`id`),
index (`user_id`, `attribute_id`),
foreign key (`user_id`) references `user` (`id`) on delete cascade
foreign key (`attribute_id`) references `user_attribute` (`id`) on delete cascade
)engine=InnoDB default charset=utf8;
create table `user_attribute` (
`id` int(11) unsigned not null auto_increment,
`name` varchar(60) not null,
primary key (`id`),
unique key (`name`),
)engine=InnoDB default charset=utf8;
从用户表到user_attribute表的FK将确保从用户删除行,user_attribute中的任何子行也将被删除。唯一键也添加到属性表中,以确保您无法添加任何欺骗属性。
修改强> 使用支持M:M的第3个表更新了模式(通过1:M - M:1)。如果您需要向用户属性添加更多信息,这将允许更大的灵活性。