1

次のデータベースシナリオを設定したいと思います。

CREATE TABLE IF NOT EXISTS `points` (
  `po_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `po_north` INT,
  `po_east` INT,
  PRIMARY KEY (`po_id`),
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `lines`(
  `li_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `li_from` INT NOT NULL,
  `li_to` INT NOT NULL,
  PRIMARY KEY (`li_id`),
  FOREIGN KEY (`li_from`) REFERENCES points(`po_id`),
  FOREIGN KEY (`li_to`) REFERENCES points(`po_id`),
) ENGINE=InnoDB;

次に、3番目のテーブルを設定します。これは、ポイントまたはラインを作成または変更した人などのメタデータを傷つけます。

CREATE TABLE IF NOT EXISTS `metadata` (
  `me_type` ENUM('point','line') NOT NULL,
  `me_type_id` INT UNSIGNED NOT NULL,
  `me_permissions` VARCHAR(255) NOT NULL,
  `me_created_by` INT UNSIGNED NOT NULL,
  `me_created_on` DATETIME NOT NULL,
  `me_last_modified_by` INT UNSIGNED NOT NULL,
  `me_last_modified_by` DATETIME NOT NULL,
) ENGINE=InnoDB;

私の最初のアプローチはENUM、2つのタイプ(点と線)でを設定することでした。しかし、問題は、テーブルの1つへの外部キーを適切に参照できないことです。MySQLでこのような問題に対して推奨される解決策はありますか?

ところで:とのフィールドはme_created_byme_last_modified_byいくつかのユーザーデータを格納するテーブルを参照する必要があります。

4

3 に答える 3

1

あなたのケースは、「一般化の特殊化」またはおそらく「クラス継承のためのテーブルデザイン」として知られているデザインパターンのさらに別のインスタンスのようです。

ポイントとラインをオブジェクトのクラスと考えると、どちらもより一般的なクラスのオブジェクトのサブクラスです。この場合、スーパークラスにどのような名前を付けるかわかりません。これは、同じ問題に対処する以前のいくつかの質問の1つです。

データベース内のクラスの拡張

ファウラーは対象の広範な治療を行います。メタデータを扱っているため、ケースにシワが追加されています。しかし、それはデザインを変える必要はありません。3番目のテーブルが必要です。これは、より適切な用語がないため、「アイテム」と呼びます。キー「it_id」には自動番号が割り当てられ、ポイントまたはラインを追加するたびにアイテムが追加されます。2つの列「po_id」と「li_id」には自動番号が割り当てられません。代わりに、Itemsテーブルの「it_id」を参照する外部キーになります。

メタデータテーブル内のポイントまたはラインへの参照は「アイテム」への参照になり、場合によってはその情報を使用してポイントまたはラインに関する情報を見つけることができます。

これがどれほど役立つかは、メタデータで何をしようとしているかによって異なります。

于 2012-07-16T11:09:08.407 に答える
0

テーブルpointslinesは、への外部キーが含まれている必要がありますmetadata。その逆ではありません。そうすることで、より複雑なテーブル設定を定義する手間を省くことができます。このアプローチを使用すると、単一のmetadataエントリを多くの異なるポイントまたはラインに数回再利用できます。これはMySQLに固有のものではなく、一般的な正規化されたデータベース構造です。

于 2012-07-16T11:12:57.763 に答える
-1

トリガーを使用してこれを行うことができます。それぞれのテーブルに基づいてレコードを挿入する前に、ポイントまたはラインのいずれかの参照キーを作成できるイベントをトリガーする必要があります。

于 2012-07-16T10:55:44.513 に答える