私たちは、顧客データを中央ユニットとする 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 でスキーマフリー テーブルを作成するソリューションはありますか? または、より有用な他のアプローチはありますか?