我们正在开发基于 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) 列。这里没有看到第二个表,我们在其中存储了列的名称。这张表看起来像这样:
id col name
====================
1 2 firstname
2 8 zip
如您所见,我们从仅包含基本列的表开始。然后,我们在每次导入或更新完成时检查是否添加了新列或不再需要列。如果是这种情况,我们已经删除了相应的列或添加了新列。此外,我们总是不得不调整附加表。
这个解决方案在速度、简单性和逻辑性方面对我们来说是一种妥协。在我们看来,最明显的解决方案是使用像 MongoDB 这样的面向文档的 DBMS。
不幸的是,我们被迫只使用 MySQL。是否有在 MySQL 中创建无模式表的解决方案?还是有其他更有用的方法?