我正在编写一个在伪互联网环境中玩的游戏。我只是在为游戏做“DNS”。基本上,是一个将字符串(“URL”)链接到机器(数据库中的另一个实体)的数据库。
与现实生活非常相似:
我的第一直觉是做这样的事情:
域_
tld表;
tld_id,tld
domain_hostname表;
主机名_
id,hostname,tld,parent
其中,hostname是URL,tld链接到域_
tld,如果是根域名,则parent为null。如果它是子域,则parent是父的主机名_
id,主机名是子域。但后来我意识到它被分配了一个冗余的tld ...虽然我认为可以给它一个空值。
我想知道是否有更聪明的想法?
答案 0 :(得分:3)
这取决于您需要对此数据执行哪些操作。你真的需要建模子域的树结构吗?这有点像真正的DNS如何委托区域权限,但如果您真正需要的是DNS的“url =>机器”方面,那么带有'machine_id'列的简单'url'表会简单得多并且可能性能更高。
如果您 需要对树结构进行建模,为什么还需要区分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表的规范化。