将“大量”数据插入MySQL以及使用外键的好处

时间:2013-07-19 21:56:28

标签: php mysql insert

我不确定如何存储或插入此数据。我正在使用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数据的插入/导入的最佳方法是什么?我是否必须像上面的插入语句那样做,或者有更好的方法吗?

1 个答案:

答案 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