在SQL中存储vCard / vcf联系人记录

时间:2012-03-17 22:03:54

标签: mysql sql vcard vcf

我想创建一个SQL表来存储vCard格式的联系人记录。有没有人为此准备好SQL CREATE脚本?

2 个答案:

答案 0 :(得分:0)

我没有脚本,但我确实有你可以使用的mySQL。在此之前,我应该提到在SQL中存储vCard似乎有两种逻辑方法:

  1. 存储整张卡片,让数据库搜索(可能)巨大的文本字符串,并在代码的另一部分甚至客户端处理它们。例如

    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;

  2. 可能很容易实现,(取决于您对数据的处理方式),但如果您有很多条目,搜索速度会很慢。 如果这只适合你,那么这可能会有效(如果它有任何优点,那么永远不会只适合你。)然后你可以使用一些漂亮的模块处理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