用于保存URL的数据库表

时间:2009-06-21 19:55:52

标签: database-design

我正在编写一个在伪互联网环境中玩的游戏。我只是在为游戏做“DNS”。基本上,是一个将字符串(“URL”)链接到机器(数据库中的另一个实体)的数据库。

与现实生活非常相似:

  • 每个计算机可以包含零个或多个网址
  • 每个网址都有 tld 。为简单起见,只有顶级域名(TLD)和没有多个扩展名的顶级域名(TLD)(呃,我的术语在那里修复?)。所以.com和.net是有效的,但.co.uk和.org.uk不是。
  • 网址可以包含零个或多个子域
  • 每个子域都可以链接到不同的计算机
  • 每个子域可以有零个或多个子域,每个子域都链接到不同的机器

我的第一直觉是做这样的事情:

_ tld表;
tld_id,tld

domain_hostname表;
主机名_ id,hostname,tld,parent

其中,hostname是URL,tld链接到域_ tld,如果是根域名,则parent为null。如果它是子域,则parent是父的主机名_ id,主机名是子域。但后来我意识到它被分配了一个冗余的tld ...虽然我认为可以给它一个空值。

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

2 个答案:

答案 0 :(得分:3)

这取决于您需要对此数据执行哪些操作。你真的需要建模子域的树结构吗?这有点像真正的DNS如何委托区域权限,但如果您真正需要的是DNS的“url =>机器”方面,那么带有'machine_id'列的简单'u​​rl'表会简单得多并且可能性能更高。

如果您 需要对树结构进行建模,为什么还需要区分TLD和子域?您可以简单地使用“domain”表,“parent”,“parent_domain_id”和“machine_id”列,并将TLD的父级设置为null。对父列建立索引可能会合理地获取TLD列表,这可能取决于数据集的大小以及需要优化的操作。这将是一个比创建两个单独的表更简单的模型,并且会更接近真正的DNS系统(除了实现之外,没有真的关于“com”的任何魔法)。

答案 1 :(得分:1)

如果需要,您可以使用第三个表作为子域。这将消除您提到的冗余问题。而不是在domain_hostname上创建父列,而是创建一个新表,如下所示:

domain_subdomain;
subdomain_id,subdomain_name,hostname_id

其中hostname_id是返回domain_hostname表的外键。这基本上是domain_hostname表的规范化。