スクリプトはありませんが、使用できる mySQL はあります。その前に、vCard を SQL に格納するには 2 つの論理的なアプローチがあるように思われることを述べておく必要があります。
カード全体を保存し、データベースに (おそらく) 巨大なテキスト文字列を検索させ、それらをコードの別の部分またはクライアント側で処理します。例えば
CREATE TABLE IF NOT EXISTS vcards
(
name_or_letter
varchar(250) NOT NULL,
vcard
text NOT NULL,
timestamp
timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY ( username
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
おそらく実装は簡単ですが (データで何をしているかによって異なります)、多くのエントリがあると検索が遅くなります。これがあなたのためだけなら、これはうまくいくかもしれません(それが良いのであれば、それはあなたのためだけではありません.あなたと。)
私は vCard の進化を見てきましたが、将来 /some/ 時に何らかの変更があることを知っているので、3 つのテーブルを使用します。
1 つ目はカードです (これは主に私の既存のテーブルにリンクされています。これが必要ない場合は、カット ダウン バージョンにすることができます)。2 つ目はカードの定義です (vCard ではプロファイルと呼ばれているようです)。最後は、カードのすべての実際のデータです。
私は DBIx::Class (はい、私はその 1 人です) にすべてのデータベース作業を任せているので、(3 つのテーブル) は私にとってはかなりうまく機能しているように見えます (もちろん、rfc2426に一致するように型を強化することはできますが)ただし、ほとんどの場合、各データは単なるテキスト文字列です。)
個人の住所を正規化しない理由は、データベースに既に住所テーブルがあり、これら 3 つはユーザー以外の連絡先の詳細のためだけにあるためです。
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 ではありませんが、お役に立てば幸いです。