Database design 用于保存URL的数据库表

Database design 用于保存URL的数据库表,database-design,Database Design,我正在写一个游戏,它是在一个类似互联网的虚拟环境中玩的。我只是在做游戏的DNS。基本上,一个将字符串(“URL”)链接到机器(数据库中的另一个实体)的数据库 与现实生活中的情况非常相似: 每台机器可以有零个或多个URL 每个url都有一个tld。为简单起见,只有TLD,没有具有多个扩展的TLD(嗯,在那里修复我的术语?)。所以.com和.net是有效的,但是.co.uk和.org.uk不是 URL可以有零个或多个子域 每个子域都可以链接到不同的计算机 每个子域可以有零个或多个子域,每个子域链接

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

与现实生活中的情况非常相似:

  • 每台机器可以有零个或多个URL
  • 每个url都有一个tld。为简单起见,只有TLD,没有具有多个扩展的TLD(嗯,在那里修复我的术语?)。所以.com和.net是有效的,但是.co.uk和.org.uk不是
  • URL可以有零个或多个子域
  • 每个子域都可以链接到不同的计算机
  • 每个子域可以有零个或多个子域,每个子域链接到不同的机器
我的第一反应是这样做:

tld表
tld_id,tld

域主机名表
主机名
\u
id、主机名、tld、父级

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


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

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

域\子域
子域id、子域名称、主机名id


其中hostname\u id是返回到domain\u hostname表的外键。这实质上是域主机名表的标准化。

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

域\子域
子域id、子域名称、主机名id


其中hostname\u id是返回到domain\u hostname表的外键。这实质上是域主机名表的标准化。

这取决于您需要对该数据执行什么操作。你真的需要对子域的树结构建模吗?这(有点)类似于真正的DNS如何委派区域权限,但是如果您真正需要的是DNS的“url=>machine”方面,那么一个简单的带有“machine\u id”列的“url”表将更简单,而且性能可能更高


如果您确实需要对树结构进行建模,为什么还要区分TLD和子域呢?您可以简单地拥有一个带有“name”、“parent\u domain\u id”和“machine\u id”列的“domain”表,并将TLD的parent设置为null。对父列进行索引可能会使获取TLD列表的性能合理,这可能取决于数据集的大小以及需要优化的操作。这将是一个比创建两个单独的表更简单的模型,并且将更接近真实的DNS系统(除了实现之外,“com”真的没有什么神奇之处)。

这取决于您需要对这些数据执行什么操作。你真的需要对子域的树结构建模吗?这(有点)类似于真正的DNS如何委派区域权限,但是如果您真正需要的是DNS的“url=>machine”方面,那么一个简单的带有“machine\u id”列的“url”表将更简单,而且性能可能更高


如果您确实需要对树结构进行建模,为什么还要区分TLD和子域呢?您可以简单地拥有一个带有“name”、“parent\u domain\u id”和“machine\u id”列的“domain”表,并将TLD的parent设置为null。对父列进行索引可能会使获取TLD列表的性能合理,这可能取决于数据集的大小以及需要优化的操作。这将是一个比创建两个单独的表更简单的模型,并且将更接近真实的DNS系统(除了实现之外,“com”并没有什么神奇之处)。

.co.uk和.org.uk不是TLD。uk是顶级域。co.uk是二级域。co.uk和.org.uk不是TLD。uk是顶级域名。co.uk是二级域名。