2012-03-17 3 views

답변

0

스크립트가 없지만 사용할 수있는 mySQL이 있습니다.

  1. 스토어 전체 카드와, (아마도) 거대한 텍스트 문자열 데이터베이스 검색을하자, 그리고 다른 부분에서 그들을 처리 : 그 전에 내가 SQL에 저장 vCard를 두 개의 논리적 인 접근 방법이있을 것 같다 언급한다 귀하의 코드 또는 심지어 클라이언트 쪽. 예 : NOT은 vcards있는 경우

    (NULL NOT name_or_letter VARCHAR (250), NULL NOT
    vcard 텍스트, 업데이트 CURRENT_TIMESTAMP에
    timestamp 타임 스탬프 NOT NULL 기본 CURRENT_TIMESTAMP,
    PRIMARY KEY (username)
    ) 엔진을 테이블 만들기 = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_bin;

많은 항목이있는 경우 검색 속도가 느려지 긴하지만 (데이터로 무엇을 하느냐에 따라) 쉽게 구현할 수 있습니다. 이것이 좋은 방법이라면 올바르게 작동 할 것입니다 (어떤 경우에는 이 아닙니다.). 그런 다음 공유하는 아름다운 모듈을 사용하여 vCard 클라이언트 측 또는 서버 측을 처리 할 수 ​​있습니다 (또는 다른 사람이 당신과 함께 공유.)

나는 vCard를 진화를 봤어 내가 세 개의 테이블을 사용할 수 있도록 미래에/어떤/한 번에 몇 가지 변화 이있을 것이라는 것을을 알고있다.

첫 번째 카드입니다 (이 기능은 대개 내 기존 테이블로 다시 연결됩니다. 필요없는 경우 자름 버전이 될 수 있음). 두 번째는 카드 정의입니다 (vCard에서 프로필이라고도 함). 마지막 카드의 모든 실제 데이터입니다.

나는 DBIx :: Class를 허용했기 때문에 (예를 들어 나는 그 중 하나이다.) 모든 데이터베이스 작업을 수행한다. (세 테이블) 나를 위해 잘 작동하는 것 같다. (물론 분명히 유형은 더 밀접하게 을 rfc2426에 맞게하지만, 대부분의 경우 데이터의 각 부분은 텍스트 문자열입니다.)

내가 사람의 주소를 정상화하지 않는 이유입니다 내가 이미 주소를 가지고 내 데이터베이스에있는이 테이블은 비 사용자 연락처 세부 정보 용입니다.

CREATE TABLE `vCards` ( 
`card_id` int(255) unsigned NOT NULL AUTO_INCREMENT, 
`card_peid` int(255) DEFAULT NULL COMMENT 'link back to user table', 
`card_acid` int(255) DEFAULT NULL COMMENT 'link back to account table',  
`card_language` varchar(5) DEFAULT NULL COMMENT 'en en_GB', 
`card_encoding` varchar(32) DEFAULT 'UTF-8' COMMENT 'why use anything else?', 
`card_created` datetime NOT NULL, 
`card_updated` datetime NOT NULL, 
PRIMARY KEY (`card_id`)) 
ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='These are the contact cards'; 

    create table vCard_profile (
    vcprofile_id int(255) unsigned auto_increment NOT NULL, 
    vcprofile_version enum('rfc2426') DEFAULT "rfc2426" COMMENT "defaults to vCard 3.0", 
    vcprofile_feature char(16) COMMENT "FN to CATEGORIES", 
    vcprofile_type enum('text','bin') DEFAULT "text" COMMENT "if it is too large for vcd_value then user vcd_bin", 
    PRIMARY KEY (`vcprofile_id`) 
) COMMENT "These are the valid types of card entry"; 
INSERT INTO vCard_profile VALUES('','rfc2426','FN','text'),('','rfc2426','N','text'),('','rfc2426','NICKNAME','text'),('','rfc2426','PHOTO','bin'),('','rfc2426','BDAY','text'),('','rfc2426','ADR','text'),('','rfc2426','LABEL','text'),('','rfc2426','TEL','text'),('','rfc2426','EMAIL','text'),('','rfc2426','MAILER','text'),('','rfc2426','TZ','text'),('','rfc2426','GEO','text'),('','rfc2426','TITLE','text'),('','rfc2426','ROLE','text'),('','rfc2426','LOGO','bin'),('','rfc2426','AGENT','text'),('','rfc2426','ORG','text'),('','rfc2426','CATEGORIES','text'),('','rfc2426','NOTE','text'),('','rfc2426','PRODID','text'),('','rfc2426','REV','text'),('','rfc2426','SORT-STRING','text'),('','rfc2426','SOUND','bin'),('','rfc2426','UID','text'),('','rfc2426','URL','text'),('','rfc2426','VERSION','text'),('','rfc2426','CLASS','text'),('','rfc2426','KEY','bin'); 

create table vCard_data (
    vcd_id int(255) unsigned auto_increment NOT NULL, 
    vcd_card_id int(255) NOT NULL, 
    vcd_profile_id int(255) NOT NULL, 
    vcd_prof_detail varchar(255) COMMENT "work,home,preferred,order for e.g. multiple email addresses", 
    vcd_value varchar(255), 
    vcd_bin blob COMMENT "for when varchar(255) is too small", 
    PRIMARY KEY (`vcd_id`) 
) COMMENT "The actual vCard data"; 

이것은 최상의 SQL은 아니지만 도움이 되길 바랍니다.

+0

[이 다른 질문] (http://stackoverflow.com/questions/38352/address-book-db-schema/11313185#11313185)도 도움이 될 수 있습니다. –