我不确定如何存储或插入这些数据。我正在使用 PHP 和 MySQL。
假设我们试图跟踪参加马拉松比赛的人(比如慢跑或其他)。到目前为止,我有一张Person
包含我所有个人信息的表格。每个人恰好与一个唯一的 varchar(40) 键相关联。有一个马拉松信息表(Marathon
)。我以 CSV 格式接收大约 130,000 行的人员数据并将其导入数据库。
所以 - 现在的问题是......我如何处理 Person 和 Marathon 之间的关联?对于每个 Marathon,我都会获得需要导入的大量参与者列表(通过唯一的 varchar 键)。所以......如果我走外键路线,似乎插入会非常繁重,为该人查找适当的外键。我什至不确定我会如何写那个插入......我猜它看起来像这样:
insert into person_marathon
select p.person_id, m.marathon_id
from ( select 'person_a' as p_name, 'marathon_a' as m_name union
select 'person_b' as p_name, 'marathon_a' as m_name )
as imported_marathon_person_list
join person p
on p.person_name = imported_marathon_person_list.p_name
join marathon m
on m.marathon_name = imported_marathon_person_list.m_name
一次处理的马拉松并不多。不过有很多人。
-->我是否应该给这个人一个 ID 并要求所有的外键?还是只使用唯一的 varchar(40) 作为真正的表键?但是后来我必须在 varchar 上加入表,这很糟糕。一场马拉松可以有 1k 到 30k 的参与者。
-->或者,我可以从数据库中选择人员信息和马拉松信息,并将其与 PHP 中的 marathon_person 数据连接起来,然后再将其发送到 MySQL。
-->或者,我猜,也许做一个临时表,然后加入数据库,然后插入(通过 PHP)?已经强烈建议我不要使用临时表(这是一项工作,这不是我的数据库)。
编辑:我不确定要使用什么模式,因为我不确定我是否应该使用外键(整篇文章的目的是回答这个问题),但基本设计类似于......
create table person (
person_id int unisgned auto_incrememnt,
person_key varchar(40) not null,
primary key (person_id),
constraint uc_person_key unique (person_key)
)
create table marathon (
marathon_id int unisgned auto_incrememnt,
marathon_name varchar(60) not null,
primary key (marathon_id)
)
create table person_marathon (
person_marathon_id int unsigned auto_increment,
person_id int unsigned,
marathon_id int unsigned,
primary key (person_marathon_id),
constraint uc_person_marathon unique (person_id, marathon_id),
foreign key person_id references person (person_id),
foreign key marathon_id references marathon (marathon_id)
)
我将很快重复实际问题......如果我选择使用外键person
,我如何以有效的方式导入所有带有 person_id 的 person_marathon 数据?我上面包含的插入语句是我最好的猜测......
数据以大约 130,000 行的person
CSV 格式出现,因此可以直接导入到 person 表中。个人数据带有每个人的唯一 varchar(40)。
每个马拉松比赛的person_marathon
数据都以 CSV 格式提供,作为 1,000 到 30,000 个唯一 varchar(40) 的列表,代表参加该马拉松比赛的每个人。
摘要:我正在使用PHP。那么,如果我使用外键,那么编写 person_marathon 数据的插入/导入的最佳方法是什么? 我必须像上面的插入语句那样做还是有更好的方法?