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

问题描述 投票:0回答:1

在我的设计中,我有许多使用FK的表。问题是,由于某些记录链接到特定的项目文件时,某些记录将在不同的时间点被删除和重新添加,因此如果我依靠传统的自动递增ID,则引用将总是不准确(因为每次重新添加后,他们将获得一个新的ID)。

我以前问过一个问题(Sqlite - composite PK with two auto-incrementing values),我是否可以创建一个复合自动递增ID,但是似乎无法通过我所链接的问题回答。

我能想到的唯一的自动值将始终是唯一的,并且永远不会重复,它是一个完整的日期值,一直到第二个值-但是将日期用于表ID的想法感觉很糟糕。因此,如果我改为在每个表中放置一个完整的日期字段并将其用作FK参考,那么我是否正在寻找潜在的问题?我是否认为将其存储为整数而不是文本值会更有效?

感谢您的帮助

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

sql sqlite foreign-keys primary-key
1个回答
0
投票

对于评论,这有点长。

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

当您在表中插入一行时,数据库将意识到该实体。不应引用它。

因此,您遇到了不寻常的情况。听起来您有代表真实世界中某些事物的主键-例如社会保险号或车辆识别号。在这种情况下,您可能希望此ID作为表的主键。

另一个选择是软删除。一旦将这些行之一插入表中,就无法将其删除。但是,您可以设置一个标志,指出它已被删除。然后,外键引用可以保留到“软”删除行。

© www.soinside.com 2019 - 2024. All rights reserved.