0

ルックアップテーブルを設計する際に、より良い方法や原則があるかどうか疑問に思います。

私は、さまざまな状況に対応できる抽象的なルックアップテーブルを設計するつもりです。

たとえば、ルックアップテーブルをテーブルと呼びmasters and slavesます。

CREATE TABLE IF NOT EXISTS `masters_slaves` (
  `mns_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `master_id` varchar(255) DEFAULT NULL COMMENT 'user id or page id',
  `slave_id` varchar(255) DEFAULT NULL COMMENT 'member id or user id or page id',
  `cat_id` varchar(255) DEFAULT NULL COMMENT 'category id',
  `mns_created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `mns_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`mns_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

したがって、このルックアップテーブルは、次のようなこれらのタイプの関係を提供できます。

Admins and Members
Admins and Pages
Admins and Posts
Post Categories and Posts
Page Parents and Pages
etc

表のcat_idinmasters and slavesは、これらのカテゴリを説明および区別します。たとえば、管理者やメンバーcat_id 1などです。

そして、私は挿入します:

  1. 管理者IDを列に master_id、メンバーIDを slave_id列に
  2. 親ページIDを列に master_id、子ページIDを slave_id列に
  3. カテゴリIDをの列に投稿しmaster_id、ページIDを slave_id列に投稿します

しかし、私はそれのために行くべきかどうかについて確信しています:

  1. これは優れたルックアップテーブルのプラクティスですか、それとも多くの場合、さまざまな関係に対して複数のルックアップテーブルを作成する必要がありますか?
  2. このようなルックアップテーブルを実行できた場合、これはすべてに対して1つのルックアップテーブルにすぎませんが、将来どのような結果になりますか?この唯一のルックアップテーブルは、サイトのコンテンツが大きくなると過剰に入力されますか?
  3. もう1つ頭に浮かぶのは、タグシステムもルックアップテーブルソリューションではないかということです。

ありがとう。

4

2 に答える 2

4

これは、アンチパターンのOne TrueLookupTableに非常によく似ています。グーグルそれ!

これが私が1分以内に思いついた悪いことのリストです:

  • 参照整合性を強制することはできません
  • すべての関係は、多対多または1対多のいずれかである必要があります
  • 属性を処理できなくなります(store_id=7で販売されたarticle_id=1の100個)
  • 単一の列のキーのみを処理できます
  • テーブルは大きくなります(したがって、平均して遅くなります)
  • インデックスも大きくなります(したがって、平均して遅くなります)
  • 不必要な競合を引き起こす可能性があります
  • オプティマイザーの統計は歪曲されます
  • データベースのメンテナンスが難しくなります

私は簡単にもっと多くを思い付くことができましたが、それが本当に必要だとは思いません;)

データベースの経験があまりない場合は、ものを再利用して「共通の」構造を使用するのは良いことのように感じますが、データベースがその恩恵を受けることはめったにありません。

関係には別々のテーブルを使用してください。最終的には、とにかくそれを行います。

于 2011-03-19T18:52:08.660 に答える
1

私の経験から、カテゴリごとにルックアップテーブルを作成することをお勧めします。私が見ているメリットは次のとおりです。

  1. 1つのルックアップテーブルが非常に大きくなる可能性がありますが、いくつかの小さなルックアップテーブルは、mysqlのキャッシュメカニズムによってメモリにロードされ、特別なカテゴリにアクセスしている場合はそこからのみ処理されます。
  2. いくつかの小さなテーブルのロード/リロード/バックアップなどが簡単です。
  3. 後でテーブルスキーマを変更できます。たとえば、1つのタイプのカテゴリに対してのみ別のフィールドを追加したいとします。このグローバルテーブルのすべての行に追加する必要はありません。

大きなテーブルよりも小さなテーブルをいくつか持つことには、より多くの長所があると思います。

于 2011-03-19T18:29:38.547 に答える