-2

私たちは、顧客データを中央ユニットとする LAMP ベースのソフトウェアに取り組んでいます。顧客データを含むテーブルは、インポート インターフェイスを介してさまざまなソースから提供されます。問題は、テーブルに固定スキーマがあってはならないことです。行 X には 5 つの列があり、行 Y には 20 の列がある場合があります。

以前の解決策は次のとおりです。

CREATE TABLE `customers` (
  `id` int (10) unsigned NOT NULL auto_increment,
  `branch_id` int (10) unsigned NOT NULL,
  `type` tinyint (1) DEFAULT NULL,
  `visible` tinyint (1) DEFAULT NULL,
  `status` tinyint (1) NOT NULL DEFAULT '1',
  `2` varchar (255) NOT NULL,
  `3` varchar (255) NOT NULL,
  `4` varchar (255) NOT NULL,
  `5` varchar (255) NOT NULL,
  `6` varchar (255) NOT NULL,
  `7` varchar (255) NOT NULL,
  `8` varchar (255) NOT NULL,
  `9` varchar (255) NOT NULL,
  `10` varchar (255) NOT NULL,
  `11` varchar (255) NOT NULL,
  `12` varchar (255) NOT NULL,
  `13` varchar (255) NOT NULL,
  `14` varchar (255) NOT NULL,
  `15` varchar (255) NOT NULL,
  `17` varchar (255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `branch_id` (`branch_id`)
  FULLTEXT KEY `search` (`2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8;

このテーブルには、テーブルに格納されるデータの種類がわからなかったため、大きなオーバーヘッドがありました。そのため、varchar(255) 列のみを作成する必要がありました。ここには、列の名前を格納した 2 番目のテーブルはありません。この表は次のようになります。

id   col   name
====================
1    2     firstname
2    8     zip

ご覧のとおり、基本的な列のみを含むテーブルから始めました。次に、インポートまたは更新が行われるたびに、新しい列が追加されたかどうか、または列が不要になったかどうかを確認しました。この場合、対応する列を削除するか、新しい列を追加しました。さらに、追加のテーブルを常に調整する必要がありました。

このソリューションは、スピード、シンプルさ、およびロジックの妥協案でした。私たちの意見では、最も明白な解決策は、MongoDB のようなドキュメント指向の DBMS を使用することです。

残念ながら、MySQL のみを使用することを余儀なくされています。MySQL でスキーマフリー テーブルを作成するソリューションはありますか? または、より有用な他のアプローチはありますか?

4

2 に答える 2

1

EAVパターンを調べる必要があります。PHP を使用している場合、コーディングを容易にするツールキットがいくつかあります。

于 2012-06-15T13:57:57.003 に答える
0

これがあなたに役立つかどうかはわかりません。私は自分でこれを行うことを学び、探求しているだけなので、コミュニティからの修正を歓迎します。

この時点でいくつかの「スキーマフリー」テーブルを組み合わせることを検討するとすると、それは

    CREATE TABLE `customers`(
      `id` int(10)unsigned NOT NULL auto_increment、
      `branch_id` int(10)unsigned NOT NULL、
      `type` tinyint(1)DEFAULT NULL、
      `visible` tinyint(1)DEFAULT NULL、
      `status` tinyint(1)NOT NULL DEFAULT '1'、
       主キー( `id`)、
      KEY `branch_id`(` branch_id`)
      フルテキストキー`search`(` 2`、 `3`、` 4`、 `5`、` 6`、 `7`、` 8`、 `9`、` 10`、 `11`、` 12`、 `13`、` 14`、 `15`)
    )ENGINE = MyISAM DEFAULT CHARSET = utf8;

    CREATE TABLE cust_info(
    id int(10)unsigned NOT NULL auto_increment、
    custid int(10)unsigned NOT NULL、
    名前varchar(32)NOT NULL、
    値varchar(255)、
    主キー( `id`)、
    KEY `custid`(` custid`)
    )ENGINE = MyISAM DEFAULT CHARSET = utf8;

ここで、「追加」情報をcust_infoテーブルに格納し、適切なcustidに割り当てます。テーブルが非常に大きくなることを期待している場合は、mysql(google it)でスキーマフリーを検索してください。これを適切に実装する方法に関するいくつかの優れた記事を見つけることができます(上記の私のハックの代わりに)。記事では、mysqlを非常に遅い応答状態にすることなく、データベースでインデックスのメンテナンスを実行できるように、インデックステーブルを構築する方法について説明しています。

于 2012-07-05T22:39:59.383 に答える