Sql 使用其他合成字段而不是主键引用表

Sql 使用其他合成字段而不是主键引用表,sql,database,schema,Sql,Database,Schema,我最近不得不使用一个应用程序,其中大多数表不通过主键相互引用,而是依赖于其他合成字段。例如,假设有两个表Person(id、name、token)和Pet(id、name、personToken)。一个人可以养很多宠物。Pet.personToken将是引用Person.token的外键 现在,如果我正在创建模式,我只需要使用Person.id引用其中的记录。有人告诉我,应用程序使用“令牌”列是为了方便不同服务器之间的数据迁移 我的问题是,这是一种相当普遍的设计还是仅仅是一种奇怪的设计?这似乎只

我最近不得不使用一个应用程序,其中大多数表不通过主键相互引用,而是依赖于其他合成字段。例如,假设有两个表Person(id、name、token)和Pet(id、name、personToken)。一个人可以养很多宠物。Pet.personToken将是引用Person.token的外键

现在,如果我正在创建模式,我只需要使用Person.id引用其中的记录。有人告诉我,应用程序使用“令牌”列是为了方便不同服务器之间的数据迁移


我的问题是,这是一种相当普遍的设计还是仅仅是一种奇怪的设计?

这似乎只是一种奇怪的设计

我以前从未见过这样的事情

这似乎有些过分,我必须看看索引/外键的实现。也不希望看到令牌生成器的实现

当您说我被告知应用程序使用“令牌”列是为了更方便地在不同服务器之间进行数据迁移时。这是用于复制的吗?或者只是从测试到开发


总而言之,这似乎不是我遇到过的最好的设计。

我不能说这在整个行业中是否普遍,但我在过去工作过的许多应用程序中也看到过同样的情况


我认为这是一个奇怪的设计,因为没有足够的思想投入到系统的初始设计中

主键的数据类型是什么,即
id
,它与
令牌
数据类型相比如何?另外,生成
id
的逻辑与相应的
标记的逻辑是什么?id通常是自动递增的整数。令牌通常是用户在某处手动输入的字符串。在大多数情况下,令牌是在创建每条记录时手动分配给每条记录的字符串(varchar)。在我虚构的示例中,Person.token可以是类似于Person的SSN或abitrary id的东西。环境指的是开发、测试等。