我们正在研究基于LAMP的软件,并将客户数据作为中央单元。 包含客户数据的表格由各种来源通过导入界面提供。 问题是,表格不能有固定的模式。 可能X行有5列,Y行有20列。在MySQL中创建无模式(面向文档)的表格
我们以前的解决方案是如下:
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中创建一个无模式表? 或者还有其他方法更有用吗?
为什么你不使用一列并将所有内容存储在xml中? http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html –
因为我们必须有能力在属性上执行连接。据我所知,XML数据是不可能的。 – disputable