SQLite - 使用唯一的非 PK 列作为 FK 有什么长期缺点吗?



在我的设计中,我有很多使用FK的表格。问题是因为某些记录将在链接到特定项目文件的不同时间点被删除并重新添加,如果我依赖传统的自动递增 ID,引用将始终不准确(因为每次重新添加它们时,它们都会被赋予一个新 ID(。

我之前问过一个问题(Sqlite - 具有两个自动递增值的复合 PK(,关于我是否可以创建一个复合自动递增 ID,但是我链接的问题似乎不可能回答。

我能想到的唯一一个永远是唯一且永远不会重复的自动值是完整的日期值,直到第二个 - 但是使用日期作为表 ID 的想法感觉像是糟糕的设计。因此,如果我在每个表中放置一个完整的日期字段并将其用作 FK 参考,我是否正在查看任何潜在的问题?我是否正确认为将其存储为整数而不是文本值会更有效?

感谢您的帮助

更新澄清一下,我不是在询问主键。PK 将是标准的自动递增 ID。我问的是将数百个 FK 建立在日期的基础上。

感谢您在下面的回复,我遇到的困难是我找不到类似的模型来学习。最终结果是我希望应用程序使用项目文件(如 Word 有它们的 docx 文件(将数据导入数据库。加载新项目后,将清除上一个项目的记录,但其数据将保留在项目文件(应用程序的自定义文件格式/txt 文件(中,以便可以再次添加它们。FK 都将基于项目,因此它们将仅引用当时存在于数据库中的记录。例如,由于它是一个构建世界的应用程序,假设用户添加了一个与任何项目(例如数学(相关的主题类型,由于它在应用程序中输入的形式,记录a_type编号 1,这意味着无论加载的项目如何,它都会持续存在。然而,另一种主题类型可能是恶魔学,它仅适用于加载的特定项目(例如幻想世界(。school_subject联结表需要在同一表中引用这两个作为 FK。因此,假设恶魔学是主题类型表中的第二条记录,它的自动增量值为 2 - 因此连接表记录 2 作为 FK 值。问题是,在再次重新打开此项目之前,用户可能已经添加了 10 个通用且持久的主题类型,因此下次重新添加项目的主题类型记录和school_subject记录时,恶魔学现在的 ID 为 11。但是,将重新创建school_subject交汇点表,其值为 2 的相同记录。这就是为什么我想要一个永远保持不变的 FK。我不希望所有项目都存在于数据库中,因为我希望用户能够备份和复制单个项目,并且知道即使删除了应用程序,他们也可以重新下载并重新打开他们的项目文件。

这有点长的评论。

您的设计似乎有问题。 删除表中的行时,不应有对该键的外键引用。 实体已消失。 不存在(就数据库而言(。 在大多数情况下,如果尝试删除一个表中的行,而另一个行使用外键引用引用该行,则会收到错误。

在表中插入行时,数据库会识别该实体。 不应该引用它。

因此,您有一个不寻常的情况。 听起来您有代表现实世界中某些东西的主键,例如社会安全号码或车辆识别号码。 如果是这种情况,您可能希望此 id 是表的主键。

另一种选择是软删除。 一旦在表中插入了其中一行,就无法将其删除。 但是,您可以设置一个标志,表示它已被删除。 然后,外键引用可以保留到"软"删除的行。

最新更新