2009-06-21 163 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表的规范化。