Mysql 在主键和自动递增int的上下文中实现索引字段

Mysql 在主键和自动递增int的上下文中实现索引字段,mysql,Mysql,有人提到我需要一个自动递增的id来跟踪唯一的记录。。。 …基本上…一个主键指向一个自动递增的整数 我可以看到这一点,因为用户数据是可变的。它会改变…如果你给每一行一个ID,它可以作为一种更好地跟踪用户的方法,并且不会占用太多空间-4字节 我还听说索引字段是用来加快搜索速度的 如果我有一组用户属性,比如说,A1、A2、A3,并且我有一个主键p,定义为int I…索引如何与之相关。我如何正确地实施它 列- int, varchar, varchar, varchar,....Primary Key,

有人提到我需要一个自动递增的id来跟踪唯一的记录。。。 …基本上…一个主键指向一个自动递增的整数

我可以看到这一点,因为用户数据是可变的。它会改变…如果你给每一行一个ID,它可以作为一种更好地跟踪用户的方法,并且不会占用太多空间-4字节

我还听说索引字段是用来加快搜索速度的

如果我有一组用户属性,比如说,
A1、A2、A3
,并且我有一个主键p,定义为int I…索引如何与之相关。我如何正确地实施它

列-

int, varchar, varchar, varchar,....Primary Key, Index ?

I, A1, A2, A3..., P, ?
在MySQL中:

  • 主键是一个索引
  • “自动增量”列必须是主键
  • KEY是INDEX的同义词
因此,在您的示例中,
I
将这样声明

CREATE TABLE (
  I int NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (I)
  ...
但是,这是一个“代理”键,因为它不是自然键(例如员工编号),所以在它上面也有一个唯一的索引(或键)

CREATE TABLE (    ...
  EmployeeNumber char(7) NOT NULL,
  ...
  UNIQUE KEY (EmployeeNumber)
  ...
其他索引将根据联接中的使用情况和位置在单个列或列的组合上创建,但通常索引策略与为表选择主键不同。

在MySQL中:

  • 主键是一个索引
  • “自动增量”列必须是主键
  • KEY是INDEX的同义词
因此,在您的示例中,
I
将这样声明

CREATE TABLE (
  I int NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (I)
  ...
但是,这是一个“代理”键,因为它不是自然键(例如员工编号),所以在它上面也有一个唯一的索引(或键)

CREATE TABLE (    ...
  EmployeeNumber char(7) NOT NULL,
  ...
  UNIQUE KEY (EmployeeNumber)
  ...

其他索引将根据在联接中的使用和WHERE在单个列或列的组合上创建,但通常索引策略与为表选择主键是分开的。

听起来您有一个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表到user_属性表的FK将确保如果从user中删除一行,则也将删除user_属性中的所有子行。还将Unique键添加到属性表中,以确保您无法添加任何dupe属性

编辑
使用支持M:M的第三个表(通过1:M-M:1)更新了模式。如果您需要向用户属性添加更多信息,这将提供更大的灵活性。

听起来您有一个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表到user_属性表的FK将确保如果从user中删除一行,则也将删除user_属性中的所有子行。还将Unique键添加到属性表中,以确保您无法添加任何dupe属性

编辑
使用支持M:M的第三个表(通过1:M-M:1)更新了模式。如果您需要向用户属性添加更多信息,这将提供更大的灵活性。

O.K因此,如果我将某个内容定义为主键,我可以放心,当我对其进行搜索时,搜索是有效的。数据被放在一个B树中,如这里所描述的-我不想使用代理键…只想使用你的第一个例子…这样可以吗?是的,在顶部我说“主键是一个索引”。这是一个代理密钥,用于提高自然密钥的效率。但是,是的,使用我的第一个例子谢谢…这比我想象的要简单…我只是声明一列作为主键,不会检查它的唯一性…+我知道我只有一个主键不确定你的意思,但是主键会检查uniquenessO.K,所以如果我把某个东西定义为主键,我可以放心,当我对它进行搜索时,搜索是有效的。数据被放在一个B树中,如这里所描述的-我不想使用代理键…只想使用你的第一个例子…这样可以吗?是的,在顶部我说“主键是一个索引”。这是一个代理密钥,用于提高自然密钥的效率。但是,是的,使用我的第一个例子谢谢…这比我想象的要简单…我只是声明一列作为主键,不会检查它的唯一性…+我知道我只有一个主键不知道你的意思,但主键会检查唯一性如果属性有不同的类型,这会变得很难看,因为它变成了EAV或@gbn:同意,提供了基于OP的解决方案,但我更新了架构以支持用户属性的灵活性。如果属性具有不同的类型,这会变得很糟糕,因为它成为EAV或@gbn:同意,提供了基于OP的解决方案,但我更新了架构以支持用户属性的灵活性。