加入时的唯一索引?

时间:2011-12-02 03:49:46

标签: mysql sql ruby-on-rails

三个表。

赛事有很多种族

种族有很多注册

注册中有一个整数'bib_number'

我需要的是确保号码是活动所独有的。

我的最佳解决方案是将event_id非规范化为注册...然后我可以为注册添加一个唯一的密钥:

UNIQUE KEY `index_bib_number_event_id` (`bib_number`, `event_id`)

....但我宁愿在可能的情况下避免这样做

以下是表格:

CREATE TABLE `registrations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `race_id` int(11) NOT NULL,
  `bib_number` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
)

CREATE TABLE `races` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
}

CREATE TABLE `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
}

2 个答案:

答案 0 :(得分:0)

你看..你已经对你的registration表进行了非规范化,因为bib_number不依赖于PK(id)。所以,您可以随心所欲地将event_id移动到registration,但我宁愿再次查看数据库模型并尝试找出它没问题。在设计db时你可能错过了什么。

答案 1 :(得分:0)

这些方面的东西应该有效。我相信你可以修改MySQL的语法。

我省略了自动编号,因为它们可以隐藏真正发生的事情。所有表格至少为5NF,如果您使用自动增量数字,您可能会忽略这一事实。

create table events (
  event_id integer primary key
);

create table races (
  event_id integer not null references events (event_id),
  race_id integer not null,
  primary key (event_id, race_id)
);

create table registrations (
  event_id integer not null,
  race_id integer not null,

  foreign key (event_id, race_id) 
    references races (event_id, race_id),

  registration_id integer not null,
  primary key (event_id, race_id, registration_id),

  bib_number integer not null,

  unique (event_id, bib_number)
);

以下是一些可供使用的示例数据。

-- Two events.
insert into events values (1);
insert into events values (2);

-- Three races in each event.
insert into races values (1,1);
insert into races values (1,2);
insert into races values (1,3);
insert into races values (2,1);
insert into races values (2,2);
insert into races values (2,3);

-- Some registrations.
insert into registrations values (1, 1, 1, 51);
insert into registrations values (1, 1, 2, 52);
insert into registrations values (1, 1, 3, 53);
insert into registrations values (1, 1, 4, 54);
insert into registrations values (1, 2, 1, 61);
insert into registrations values (1, 2, 2, 62);
insert into registrations values (1, 2, 3, 63);
insert into registrations values (1, 2, 4, 64);
insert into registrations values (1, 3, 1, 71);
insert into registrations values (1, 3, 2, 72);
insert into registrations values (1, 3, 3, 73);
insert into registrations values (1, 3, 4, 74);

-- These bib numbers were already used, but not in event 2.
insert into registrations values (2, 1, 1, 51);
insert into registrations values (2, 1, 2, 52);
insert into registrations values (2, 1, 3, 53);
insert into registrations values (2, 1, 4, 54);