1-テーブルに2つの列を2つの値に設定します。2- 2 番目の値用に別のテーブルを作成します。
実際のデータによって異なります。まず、データベース設計の原則と正規化の基本を理解する必要があります。正規化は、主にスペースを節約し、データの一貫性を確保するのに役立ちます。
あなたの具体的な問題について:あなたは2つ持っていてvalues
、1つのレコードに1つまたは2つのレコードを保存できると言います。値が のようなプリミティブ型であると仮定しましょうINT
。この場合、2 つの列を持つ 1 つのテーブルを使用します。
CREATE TABLE dataTable (
first INT NOT NULL,
second INT
);
first
このテーブルには、1 つの数字 ( ) と任意の数字を格納できますsecond
。実際には追加する必要がある主キーを省略しました。
今、あなたは を保存したいと言っていますaddresses
。Anaddress
はプリミティブ型ではありません。通常は、名、姓、番地、郵便番号、市区町村、および場所によってはいくつかの追加情報で構成されているためです。
繰り返しますが、簡単な方法は、これらのデータの 2 つのセットを含む 1 つのテーブルを作成することです。
CREATE TABLE dataTable (
firstName VARCHAR(40),
lastName VARCHAR(40),
street VARCHAR(40),
zipCode INT,
firstName2 VARCHAR(40),
lastName2 VARCHAR(40),
street2 VARCHAR(40),
zipCode2 INT
);
ただし、このアプローチは柔軟性がなく、スペースを浪費する可能性もあります。この場合、スキーマを分離 (「正規化」) し、2 つのテーブルを使用します。
CREATE TABLE address (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
firstName VARCHAR(40),
lastName VARCHAR(40),
street VARCHAR(40),
zipCode INT
);
CREATE TABLE dataTable (
first INT NOT NULL,
second INT,
FOREIGN KEY (first) REFERENCES address(id),
FOREIGN KEY (second) REFERENCES address(id)
);
このアプローチでは、データ テーブルに 1 つまたは 2 つのアドレスを格納 (「参照」) できます。もちろん、欠点は、新しいレコードを作成するときに 2 つのテーブルにデータを挿入する必要があることと、クエリでテーブルを適切に結合する必要があることです。ただし、たとえば、追加の制約を追加することができます。たとえば、名はオプションですが、姓は必須 ("NOT NULL") であると定義することができます。最初のアプローチでは、(2 番目の) アドレス全体がオプションであるか、最初の名前だけがオプションであるかを区別できないため、これは不可能です。
2 つ以上のアドレスを保存できないことに注意してください。制限です。
そうですね - はい、お客様が戻ってきて 3 つ保管する必要があるまでは :-)