0

mysql に 2 つのテーブルがあるとします。
1. person (id、name、lastname) -画像
2. someothertable (id、name、lastname、action、quantity) -画像

両方のテーブルを一度に更新するのが本当に悪い習慣であるかどうかを尋ねたかったのですか? たとえば、誰かが Robert Jackson の姓を「Smith」に更新した場合、次の 2 つのクエリを実行します。

mysql_query("UPDATE person SET lastname = '$lastname' WHERE id = '$id'");
mysql_query("UPDATE someothertable SET lastname = '$lastname' WHERE name = '$name' AND lastname = '$oldlastname'");

今のところ、2 つの同じ名前と姓に出会うことはないと仮定します (これは単なる例です)。テーブルからデータを表示するときにこれらの 2 つのテーブルを結合し、テーブルでのみ姓を変更することを強くpersonお勧めしますか?

以前は使用する必要がありませんjoinでした (十分な大きさのデータベースはありませんでした)。これを行う別の方法 (2 つのクエリ以外) があるかどうか疑問に思い始めました。使用joinするにはコードを変更する必要がありますが、それが正しいことであれば、私はそれを行う準備ができています。

4

3 に答える 3

2

aの使用joinは、データベースの大きさの関数ではなく、正規化とデータの整合性に関するものです。1つのテーブルにのみ存在する理由はlastname、値の同期を維持することを心配する必要がないようにするためです。あなたの例では、それらの呼び出しが単一のトランザクションにある場合、それらは同期を維持する必要があります。それらの1つが別の場所で変更された場合、またはデータベース内で手動で変更された場合を除きます。

したがって、次のテーブルを用意することもできます。

person (id, name, lastname)
someothertable (id, person_id, action, quantity)
于 2013-02-15T16:42:34.653 に答える
1

1 つのオプションは、 のフィールドにsomeothertable外部キー制約を持たせることです。更新トリガーを適用して、自動的にカスケードすることができます。lastnamePerson

以下に例を示します。

Alter table someothertable add constraint foreign key (lastname) references Person (lastname) on delete cascade on update cascade;

その一般的なバージョンを以下に示します。

Alter table [table-name] add constraint foreign key (field-in-current-table) references [other-table-name] (field-in-other-table) on delete cascade on update cascade;

これは、任意のテーブルの任意のフィールドに適用できます。その後、適切なトリガーを設定できます。ここに参照リンクがあります。

ノーマライゼーションを考えたことはありますか?

別のオプションはpersonPersonテーブル内のそれぞれに一意の ID (つまりPersonID) を割り当てることです。ここで、参照する他のすべてのテーブルでperson、一意の ID でそれらを参照します。これにより、多くの利点が追加されます。

1) データの正規化が維持される 2) データの整合性が維持される 3) 更新、トリガー、またはカスケードが不要 4) 変更は 1 か所でのみ必要となる

お役に立てれば。頑張ってください!

于 2013-02-15T16:41:23.907 に答える
1

2 更新を使用する代わりに、トリガーを使用できます:チュートリアルはこちら

于 2013-02-15T16:41:39.663 に答える