我不确定如何存储或插入此数据。我正在使用PHP和MySQL。
假设我们试图跟踪进入马拉松比赛的人(比如慢跑或其他什么)。到目前为止,我有一个Person
表,其中包含我的所有人员信息。每个人恰好与唯一的varchar(40)密钥相关联。有一个马拉松信息表(Marathon
)。我以CSV格式接收人员数据,大约130,000行并将其导入数据库。
所以 - 现在问题是......我如何处理人与马拉松之间的联系?对于每个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上加入表,这很糟糕。马拉松比赛的参赛人数可达1至3万人。
- > 或者,我可以从数据库中选择人员信息和马拉松信息,然后将其与PHP中的marathon_person数据一起发送,然后再发送给MySQL。
- > 或者,我想,也许制作一个临时表,然后加入db,然后插入(通过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_marathon数据与person_id一起导入?我上面包含的插入语句是我最好的猜测....
person
数据以大约130,000行的CSV格式存储,因此直接导入到人员表中。人员数据为每个人提供了唯一的varchar(40)。
person_marathon
数据以每个马拉松的CSV形式出现,作为代表参加该马拉松的每个人的1,000到30,000个唯一varchar(40)的列表。
摘要:我正在使用PHP。那么,如果我使用外键,那么编写person_marathon数据的插入/导入的最佳方法是什么?我是否必须像上面的插入语句那样做,或者有更好的方法吗?
答案 0 :(得分:-1)
这是一种多对多的关系,一个人可以进入许多马拉松,一个马拉松可以由许多人进入。您需要在数据模型中使用其他表来跟踪此关系,例如:
CREATE TABLE persons_marathons(
personID int FOREIGN KEY REFERENCES Persons(P_Id),
marathonID int FOREIGN KEY REFERENCES Marathons(M_Id)
)
此表使用外键约束。外键约束可防止插入错误数据(例如,当Persons表中没有此类ID时,您无法插入personID = 123的行),它还会阻止删除会破坏表之间链接的行(例如,您无法删除当一个人X存在于person_marathon表中的记录时,这个personID)。
如果此表包含以下行:
personID | MarathonID
----------+-----------
2 | 3
3 | 3
2 | 8
3 | 8
这意味着第2和第3人都进入了马拉松3和8