2009-06-21 162 views
1

我正在寫一個遊戲,在類似環境的僞互聯網中播放。我只是在做遊戲的「DNS」。基本上,一個將字符串(「URL」)鏈接到機器(數據庫中的另一個實體)的數據庫。數據庫表保存URL

很像現實生活中:

  • 每個可以有零個或多個網址
  • 的每個網址都具有TLD。爲了簡單起見,只有TLD和沒有超過一個擴展名的TLD(呃,在那裏修正我的術語?)。所以.com和.net是有效的,但.co.uk和.org.uk不是。
  • URL可以具有零個或多個亞結構域
  • 每個子域可以連接到一個不同的機
  • 每個子域可具有零和或多個子域,每個連接到不同的機器

我的第一反應是至做這樣的事情:

domain _ tld table;
tld_id,tld

domain_hostname table;
主機名_ ID,主機名,TLD,父母

其中,主機名是URL,TLD鏈接到域_ TLD,父爲空,如果它的根域名。如果它是一個子域,那麼父項是父項的主機名_ id,並且主機名是子域。但後來我意識到它正在分配一個冗餘的tld ...雖然我想這可能只是一個空值。

我想知道是否有更聰明的想法?

+0

.co.uk和.org.uk不是tlds。 .uk是頂級域名。 – 2009-06-21 20:01:21

回答

3

這取決於您需要對此數據執行哪些操作。你真的需要模擬子域的樹結構嗎?這就像真正的DNS委派區域權限一樣,但如果你真正需要的只是DNS的「url => machine」方面,那麼帶有'machine_id'列的簡單'u​​rl'表會更簡單,可能更高性能。

如果你需要建模樹結構,爲什麼要區分TLD和子域?您可以簡單地在「域名」表中添加「名稱」,「parent_domain_id」和「machine_id」列,並將TLD的父級設置爲空。對父列進行索引可能會提取合理執行的TLD列表,具體取決於數據集的大小以及您需要優化哪些操作。這會比創建兩個單獨的表更簡單一些,並且與實際的DNS系統更加匹配(除了實現之外,沒有任何關於「com」的神奇功能)。

1

如果需要,您可以爲子域使用第三個表。這將消除您提到的冗餘問題。而不是在domain_hostname上有父列創建一個新表,如下所示:

domain_subdomain;
subdomain_id,subdomain_name,hostname_id

其中,hostname_id是返回到domain_hostname表的外鍵。這基本上是domain_hostname表的規範化。