2012-06-15 33 views
-2

我们正在研究基于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中创建一个无模式表? 或者还有其他方法更有用吗?

+0

为什么你不使用一列并将所有内容存储在xml中? http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html –

+0

因为我们必须有能力在属性上执行连接。据我所知,XML数据是不可能的。 – disputable

回答

1

您应该探索EAV模式。如果你正在使用PHP,然后有一些工具包,可以使你更容易编码:

+0

我们现在考虑这个解决方案。不幸的是,该软件是建立在我们开发的框架上的,所以我们不想从其他来源整合框架和类。但是,这种解决方案似乎有可能像以前一样执行复杂的连接,即使它不会那么简单。 – disputable

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', 
     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; 

    CREATE TABLE cust_info (
    id int(10) unsigned NOT NULL auto_increment, 
    custid int(10) unsigned NOT NULL, 
    name varchar(32) NOT NULL, 
    value varchar(255), 
    PRIMARY KEY (`id`), 
    KEY `custid` (`custid`) 
    ) ENGINE = MyISAM DEFAULT CHARSET = utf8; 

现在只需在cust_info表中存储“额外”信息,并将其分配给适当的custid。如果你期望你的表格变得非常大,那么在mysql中查找无模式(谷歌它),你可以找到一些关于如何正确实现这个(而不是我的破解)的好文章。这些文章讨论如何构建索引表,这样您就可以在数据库上执行索引维护,而无需将mysql带入非常慢的响应状态。