2011-03-27 80 views
0

我在爲PostgreSQL項目創建模式時遇到問題。創建SQL模式(postgresql)

這是一個社交網站,如果有個人資料,每個個人資料都有三種類型:通用,教育和就業情況,因此每個個人資料都需要不同的屬性......我們如何在一個表中完成所有操作?

create type ProfileTypeValue as enum 
    ('generic', 'education', 'employment'); 

create Profiles (
    id integer 
    type ProfileTypeValue 
    ....? 
    primary key (id) 
); 

,因爲例如,如果它是一個教育資料,然後我們需要有機構名稱等,或者如果它是一個就業的個人資料,那麼我們就需要有僱主的名字屬性等

是它最好只有3個不同的表格,每個配置文件1個類型,不知道這是否可能...但我覺得我需要有一個if語句說明它是否爲profile,包含這些屬性,或者如果它的配置文件包含這些屬性,等等

回答

3

這裏有幾個選項

  1. 都在同一個表中的一個表,具體的使用對普通的個人資料表
  2. 繼承
  3. key-value存儲
外鍵引用自己的表配置文件類型
  • 常用配置屬性

    都在同一個表

    在此選項中的所有領域都始終存在任何類型的配置文件。由於您只需列出所有列,因此這很容易首次執行。然而,這是一個非常糟糕的設計,從長遠來看,這會讓你的生活更加艱難,因爲可維護性和可擴展性很差。你應該閱讀數據庫正常表單等。不要這樣做。

    主的個人資料表和配置文件類型在他們自己的表

    在這個選項中,你將創建一個表的所有配置文件相關的細節。這將包括所有常見屬性。該表格將確保標識符全部在相同的名稱空間中,並且每個配置文件具有唯一的ID。對於每個配置文件類型,您將創建一個新表,該表具有對主配置文件表的外鍵引用。然後,您可以在就業情況簡表和主簡檔表上使用內部聯接來選擇所有就業情況。該設計允許您爲每個配置文件類型創建約束。此外,這種設計可以讓你擁有就業和教育檔案。你應該這樣做。

    繼承

    Postges提供了表繼承的設施。您可以通過爲所有配置文件類型創建一個基表併爲每個配置文件類型創建子表來使用它。每個配置文件類型都會繼承父表中定義的所有屬性。通過繼承,您可以使用父表和所有就業配置文件使用就業配置文件表選擇所有配置文件。如果通用配置文件僅使用通用屬性,則它們可以存儲到父表中。

    在postgres中繼承的主要缺點是父表和子表不共享相同的名稱空間。您無法創建跨越所有表的唯一約束。這意味着你必須確保標識符在其他方面是全球唯一的,例如爲配置文件標識符保留一個單獨的表。

    你應該考慮繼承的缺點在你的情況下是否重要。但是,如果您使用的是postgres,則這是爲所有配置文件類型執行單獨表的明智方式,因爲您不必複製常用屬性的定義。

    key-value存儲

    你也可以創建普通的個人資料屬性表,​​並保持attribues的其餘部分(配置文件,屬性值)元組。通過這樣做,你會放棄RDBMS的好處,並且你必須在你的程序中實現所有的邏輯。不要這樣做。

  • +2

    +1,非常好的答案。就個人而言,我會選擇2.選項3可以在Postgres中使用'hstore'數據類型來完成,這種數據類型非常高效,並且可以被索引。 – 2011-03-27 09:08:28

    +0

    評論中的錯字:hstore用於選項4(鍵值存儲):http://www.postgresql.org/docs/9.0/static/hstore.html。 – 2011-03-27 09:18:44

    +0

    @Aleski:你說得對。謝謝 – 2011-03-27 09:35:31

    1

    PostgreSQL支持表級繼承。您可以創建一個配置文件表作爲具有公共屬性的父表,然後將其分配給僅用於教育和就業的子表(僅限於這些類別的屬性)

    查看PostgreSQL文檔here