このデータを保存または挿入する方法がわかりません。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 行のperson
CSV で提供されるため、person テーブルに直接インポートされます。個人データには、個人ごとに一意の varchar(40) が付属しています。
データは、そのperson_marathon
マラソンに参加した各人を表す 1,000 ~ 30,000 の一意の varchar(40) のリストとして、各マラソンの CSV で提供されます。
概要: PHP を使用しています。外部キーを使用している場合、 person_marathon データの挿入/インポートを記述する最良の方法は何ですか? 上記の挿入ステートメントのようにする必要がありますか、それとももっと良い方法がありますか?