2012-06-15 2 views
-2

고객 데이터가 포함 된 램프 기반 소프트웨어를 중심으로 작업하고 있습니다. 고객 데이터가있는 테이블은 가져 오기 인터페이스를 통해 다양한 소스에서 제공됩니다. 문제는 테이블에 고정 스키마가 없어야한다는 것입니다. 행 X에 5 개의 열이 있고 행 Y에 20 개의 열이있을 수 있습니다.MySQL에서 스키마가없는 (문서 지향) 테이블 만들기

우리의 이전 솔루션은 다음과 같이했다 :

(255) 우리는 테이블에 저장 될 데이터의 종류를 알지 못했다, 그래서 우리는 VARCHAR를 작성했기 때문에이 표는 큰 오버 헤드를 가지고
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; 

열. 여기에 열 이름을 저장 한 두 번째 테이블은 없습니다. 당신이 볼 수 있듯이

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 패턴을 탐색해야합니다. 당신과 난이 작동 할 경우

+0

이제이 솔루션을 고려하십시오. 불행히도이 소프트웨어는 우리가 개발 한 프레임 워크를 기반으로하므로 다른 소스의 프레임 워크와 클래스를 통합하고 싶지는 않습니다. 그러나이 솔루션으로 이전처럼 복잡한 조인을 수행하는 것이 가능할 수 있습니다. – disputable

0

는 잘 모르겠어요 : 당신이 PHP를 사용하는 경우, 다음을 쉽게 코딩 할 수있는 몇 가지 툴킷이있다 그냥 내 자신을 배우면서 탐구하는 것입니다. 따라서 커뮤니티의 수정을 환영합니다.

이 시점에서 일부 "스키마가없는"테이블을 결합한다고 가정하면 입니다.

0123입니다.
 
    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 (Google Google)에서 schema-free를 찾아보십시오. 위의 해킹 대신 올바르게 구현하는 방법에 대한 좋은 기사를 찾을 수 있습니다. 기사에서는 인덱스 테이블을 작성하는 방법에 대해 설명하므로 mysql을 매우 느린 응답 상태로 만들지 않고 데이터베이스에서 인덱스 유지 관리를 수행 할 수 있습니다.

관련 문제