【问题标题】:Seeking Schema for vCard Data Elements寻找 vCard 数据元素的架构
【发布时间】:2012-02-27 03:37:25
【问题描述】:

我需要一个关系数据库架构来存储 vCard ver 3 数据元素。

与其阅读 RFC 并从头开始设计一个,我想看看是否有人愿意分享他们的数据库设计。

【问题讨论】:

    标签: database-schema vcf-vcard


    【解决方案1】:

    (http://i.stack.imgur.com/61qGU.png)

    这是我的 VCard 3.0 数据库架构。这与 CardMe 库配合得很好,每种类型都映射到一个数据库表,并且通过外键强制执行多对多/一对多关系。

    CREATE DATABASE ERP;
    CREATE TABLE ERP.CONTACT_MAIL_ADDRESS
    (
        MAIL_ADDRESS_ID CHAR(36) NOT NULL,
        POBOX VARCHAR(30),
        EXTENDED_ADDRESS VARCHAR(255),
        STREET VARCHAR(255) NOT NULL,
        LOCALITY VARCHAR(50),
        REGION VARCHAR(50),
        POSTAL_CODE VARCHAR(30),
        COUNTRY VARCHAR(50),
        PRIMARY KEY(MAIL_ADDRESS_ID)
    );
    
    CREATE TABLE ERP.CONTACT_PHONE_NUMBER
    (
        PHONE_NUMBER_ID CHAR(36) NOT NULL,
        LOCAL_NUMBER VARCHAR(255) NOT NULL,         -- Free form telephone number
        PRIMARY KEY(PHONE_NUMBER_ID)
    );
    
    CREATE TABLE ERP.CONTACT_EMAIL
    (
        EMAIL_ID CHAR(36) NOT NULL,
        EMAIL_ADDRESS VARCHAR(255) NOT NULL,
        PRIMARY KEY(EMAIL_ID)
    );
    
    CREATE TABLE ERP.CONTACT_AGENT
    (
        AGENT_ID CHAR(36) NOT NULL,
        URI VARCHAR(255) NOT NULL,
        PRIMARY KEY(AGENT_ID)
    );
    
    CREATE TABLE ERP.CONTACT_CATEGORIES
    (
        CATEGORY_ID CHAR(36) NOT NULL,
        CATEGORY_NAME VARCHAR(255) NOT NULL,
        PRIMARY KEY(CATEGORY_ID)
    );
    
    CREATE TABLE ERP.CONTACT_NOTE
    (
        NOTE_ID CHAR(36) NOT NULL,
        NOTE TEXT NOT NULL,
        PRIMARY KEY(NOTE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_XTENDED
    (
        XTENDED_ID CHAR(36) NOT NULL,
        XNAME VARCHAR(255) NOT NULL,
        XVALUE VARCHAR(255) NOT NULL,
        PRIMARY KEY(XTENDED_ID)
    );
    
    CREATE TABLE ERP.CONTACT_KEYS
    (
        KEY_ID CHAR(36) NOT NULL,
        KEY_DATA TEXT NOT NULL,
        PRIMARY KEY(KEY_ID)
    );
    
    CREATE TABLE ERP.CONTACT_DATA
    (
        CONTACT_DATA_ID CHAR(36) NOT NULL,
        DATA_NAME VARCHAR(10) NOT NULL,             -- [LOGO,PHOTO,SOUND]
        URL VARCHAR(255),
        INLINE CHAR(1),
        DATA MEDIUMBLOB,
        PRIMARY KEY(CONTACT_DATA_ID)
    );
    
    CREATE TABLE ERP.CONTACT_TYPES
    (
        TYPE_ID CHAR(36) NOT NULL,
        TYPE_NAME VARCHAR(20) NOT NULL,
        PRIMARY KEY(TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_ENCODING_TYPES
    (
        ENCODING_TYPE_ID CHAR(36) NOT NULL,
        TYPE_NAME VARCHAR(20) NOT NULL,
        PRIMARY KEY(ENCODING_TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT
    (
        CONTACT_ID CHAR(36) NOT NULL,
        FN VARCHAR(255) NOT NULL,
        N VARCHAR(255) NOT NULL,
        NICKNAME VARCHAR(255),
        BDAY TIMESTAMP,
        MAILER VARCHAR(50),
        TZ INTEGER,                 -- Time zone offset in hours
        GEO_LAT DOUBLE,             -- Latitude
        GEO_LONG DOUBLE,            -- Longitude
        TITLE VARCHAR(50),
        ROLE VARCHAR(50),
        PROD_ID VARCHAR(255),
        REV VARCHAR(50),
        SORT_STRING VARCHAR(50),
        UID VARCHAR(255),
        URL VARCHAR(255),
        VERSION VARCHAR(10),
        CLASS VARCHAR(50),
        PRIMARY KEY(CONTACT_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_MAIL_ADDRESS
    (
        CONTACT_ID CHAR(36) NOT NULL,
        MAIL_ADDRESS_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(MAIL_ADDRESS_ID) REFERENCES ERP.CONTACT_MAIL_ADDRESS(MAIL_ADDRESS_ID),
        PRIMARY KEY(CONTACT_ID,MAIL_ADDRESS_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_PHONE_NUMBER
    (
        CONTACT_ID CHAR(36) NOT NULL,
        PHONE_NUMBER_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(PHONE_NUMBER_ID) REFERENCES ERP.CONTACT_PHONE_NUMBER(PHONE_NUMBER_ID),
        PRIMARY KEY(CONTACT_ID,PHONE_NUMBER_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_EMAIL
    (
        CONTACT_ID CHAR(36) NOT NULL,
        EMAIL_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(EMAIL_ID) REFERENCES ERP.CONTACT_EMAIL(EMAIL_ID),
        PRIMARY KEY(CONTACT_ID,EMAIL_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_CATEGORIES
    (
        CONTACT_ID CHAR(36) NOT NULL,
        CATEGORY_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(CATEGORY_ID) REFERENCES ERP.CONTACT_CATEGORIES(CATEGORY_ID),
        PRIMARY KEY(CONTACT_ID,CATEGORY_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_NOTE
    (
        CONTACT_ID CHAR(36) NOT NULL,
        NOTE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(NOTE_ID) REFERENCES ERP.CONTACT_NOTE(NOTE_ID),
        PRIMARY KEY(CONTACT_ID,NOTE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_DATA
    (
        CONTACT_ID CHAR(36) NOT NULL,
        CONTACT_DATA_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(CONTACT_DATA_ID) REFERENCES ERP.CONTACT_DATA(CONTACT_DATA_ID),
        PRIMARY KEY(CONTACT_ID,CONTACT_DATA_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_AGENT
    (
        CONTACT_ID CHAR(36) NOT NULL,
        AGENT_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(AGENT_ID) REFERENCES ERP.CONTACT_AGENT(AGENT_ID),
        PRIMARY KEY(CONTACT_ID,AGENT_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_KEYS
    (
        CONTACT_ID CHAR(36) NOT NULL,
        KEY_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(KEY_ID) REFERENCES ERP.CONTACT_KEYS(KEY_ID),
        PRIMARY KEY(CONTACT_ID,KEY_ID)
    );
    
    CREATE TABLE ERP.CONTACT_REL_XTENDED
    (
        CONTACT_ID CHAR(36) NOT NULL,
        XTENDED_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_ID) REFERENCES ERP.CONTACT(CONTACT_ID),
        FOREIGN KEY(XTENDED_ID) REFERENCES ERP.CONTACT_XTENDED(XTENDED_ID),
        PRIMARY KEY(CONTACT_ID,XTENDED_ID)
    );
    
    CREATE TABLE ERP.CONTACT_MAIL_ADDRESS_REL_TYPES
    (
        MAIL_ADDRESS_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(MAIL_ADDRESS_ID) REFERENCES ERP.CONTACT_MAIL_ADDRESS(MAIL_ADDRESS_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(MAIL_ADDRESS_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_PHONE_NUMBER_REL_TYPES
    (
        PHONE_NUMBER_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(PHONE_NUMBER_ID) REFERENCES ERP.CONTACT_PHONE_NUMBER(PHONE_NUMBER_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(PHONE_NUMBER_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_EMAIL_REL_TYPES
    (
        EMAIL_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(EMAIL_ID) REFERENCES ERP.CONTACT_EMAIL(EMAIL_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(EMAIL_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_NOTE_REL_TYPES
    (
        NOTE_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(NOTE_ID) REFERENCES ERP.CONTACT_NOTE(NOTE_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(NOTE_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_KEY_REL_TYPES
    (
        KEY_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(KEY_ID) REFERENCES ERP.CONTACT_KEYS(KEY_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(KEY_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_DATA_REL_TYPES
    (
        CONTACT_DATA_ID CHAR(36) NOT NULL,
        TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_DATA_ID) REFERENCES ERP.CONTACT_DATA(CONTACT_DATA_ID),
        FOREIGN KEY(TYPE_ID) REFERENCES ERP.CONTACT_TYPES(TYPE_ID),
        PRIMARY KEY(CONTACT_DATA_ID,TYPE_ID)
    );
    
    CREATE TABLE ERP.CONTACT_DATA_REL_ENCODING_TYPES
    (
        CONTACT_DATA_ID CHAR(36) NOT NULL,
        ENCODING_TYPE_ID CHAR(36) NOT NULL,
        FOREIGN KEY(CONTACT_DATA_ID) REFERENCES ERP.CONTACT_DATA(CONTACT_DATA_ID),
        FOREIGN KEY(ENCODING_TYPE_ID) REFERENCES ERP.CONTACT_ENCODING_TYPES(ENCODING_TYPE_ID),
        PRIMARY KEY(CONTACT_DATA_ID,ENCODING_TYPE_ID)
    );
    

    【讨论】:

    • 我很好奇添加额外的表有什么意义,例如 CONTACT ID 到 TELEPHONE ID,这对我来说似乎是多余的。
    • 我采用面向对象的方法对数据库进行建模。每个联系人可以有 1 到多个电话号码。所以我不能把电话字段和联系人放在同一个表中,也许有人有 10 个电话号码。如此多的 VCard 类型以一对多的关系与联系人相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多