三个表。
赛事有很多种族
种族有很多注册
注册中有一个整数'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`)
}
答案 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);