0

このデータを保存または挿入する方法がわかりません。PHPとMySQLを使用しています。

たとえば、マラソン (ジョギングなど) に参加する人を追跡しようとしているとしましょう。これまでのところ、Personすべての個人情報を含むテーブルがあります。各人はたまたま一意の varchar(40) キーに関連付けられています。マラソン情報(Marathon)の表があります。約130,000行の個人データをCSVで受け取り、それをデータベースにインポートします。

では、問題は... 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 でテーブルを結合する必要があり、それは悪いことです。マラソンには 1,000 人から 30,000 人の参加者がいます。

-->または、データベースから人物情報とマラソン情報を選択し、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 行のpersonCSV で提供されるため、person テーブルに直接インポートされます。個人データには、個人ごとに一意の varchar(40) が付属しています。

データは、そのperson_marathonマラソンに参加した各人を表す 1,000 ~ 30,000 の一意の varchar(40) のリストとして、各マラソンの CSV で提供されます。

概要: PHP を使用しています。外部キーを使用している場合、 person_marathon データの挿入/インポートを記述する最良の方法は何ですか? 上記の挿入ステートメントのようにする必要がありますか、それとももっと良い方法がありますか?

4

1 に答える 1

-1

これは多対多の関係で、1 人が複数のマラソンに参加でき、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 の行を挿入することはできません)。また、テーブル間のリンクを破壊する削除も防ぎます (たとえば、削除できないなど)。そのような personID を持つ person_marathon テーブルにレコードが存在する場合、人物 X)。

このテーブルに次の行が含まれている場合:

personID  | MarathonID
----------+-----------
    2     |  3
    3     |  3
    2     |  8
    3     |  8

これは、人 2 と人 3 が両方ともマラソン 3 と 8 に参加したことを意味します。

于 2013-07-19T22:55:16.380 に答える