我想创建一个SQL表来存储vCard格式的联系人记录。有没有人为此准备好SQL CREATE脚本?
答案 0 :(得分:0)
我没有脚本,但我确实有你可以使用的mySQL。在此之前,我应该提到在SQL中存储vCard似乎有两种逻辑方法:
存储整张卡片,让数据库搜索(可能)巨大的文本字符串,并在代码的另一部分甚至客户端处理它们。例如
CREATE TABLE IF NOT NOT EXISTS vcards
(
name_or_letter
varchar(250)NOT NULL,
vcard
文本NOT NULL,
timestamp
时间戳NOT NULL在更新CURRENT_TIMESTAMP时默认为CURRENT_TIMESTAMP,
主要关键(username
)
)ENGINE = 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,但我希望有所帮助。
答案 1 :(得分:0)
通常有两种实现方式
最简单的方法是单表方法。 在大多数情况下都可以使用(我猜是80%) 一个将包括所有vcard值,对象名称,类型等。最大的优点是速度和简便性。它也可能适合nosql数据库... 虽然很乱...
第二种方法是关系方法,即用于类型,对象等的表 它不像单表方法那样简单,但是它确实具有SQL的优势:最小的数据重复性,快速切片和切块的能力等。
我最近尝试自己在MySQL中实现这种方法 vcards MySQL implementation