我想要的是在子表中插入出版物的字符串名称以与出版物表中的出版物的 PK 相关联。例如,假设我有一个县表和一个国家内的州表。states 表将有一个国家列,在国家表中有一个外键。
期望的结果是我有一个“国家”表的“国家”表,其中:
- 可以在不首先明确添加其父国家/地区的情况下添加州。
- 为了便于使用,字符串名称在所有表中都可见
- 我不会为每个表中的每个条目存储字符串的实际副本。
因此,假设我想在一个没有条目的国家/地区添加一个州。我想拥有它,这样当我添加一个包含“Ruritania City”行的数据的对象时,“国家”的值为“Ruritania”,将发生以下情况:
- 检查“国家”表中的“Ruritania”条目。
- 如果“国家”的“国家名称”列中不存在“Ruritania”,则创建它。
- “国家”中新的鲁里塔尼亚条目的新 PK 放在“州”表中新的“鲁里塔尼亚城市”条目的外键列中。PK 用于将国家字符串名称列连接到“州”中具有 Ruritania FK 的所有行。
我确信所有这些都是非常标准的数据库内容,但我无法在文档中找到它。大多数数据库文档都是用数据库术语编写的,我很难知道何时找到了我正在寻找的术语。
我的问题是:
- 我所描述的是否可行且合理?
- 我将如何用数据库术语提出我的问题,以便我能找到答案?
- 如果您有有效实现此目标的具体想法,欢迎提出建议。我正在通过 SQLAlchemy 使用 Postgres,但是任何平台的答案都应该可以帮助我找到我正在寻找的东西。
编辑回应@mustaccio:
我认为不断被术语所抛弃。当我读到“回填”之类的选项时,我将其解释为父表将填充从子表链接的数据。我不希望它开箱即用地工作,但如果不是这样,回填意味着什么?
即使 DBMS 没有实现我描述为一个功能的所有功能,我预计这将是一种足够普遍的需求,以至于会有一种标准的方法来实现它,或者至少是该任务的名称。
关键是我不希望用户在为 Ruritania City 创建条目之前必须考虑是否存在 Ruritania 国家条目。如果用户说 Ruritania City 位于 Ruritania 的国家,则 Ruritania in countries 的条目将在“国家”中创建,如果它不存在。
我并不特别关心这个逻辑是在哪里实现的,只要最终结果是一个人类可以自己理解的表,即使数据库被导出到某个地方并与控制条目创建的逻辑分开。
您描述的称为“应用程序逻辑”;显然,我熟悉的所有 DBMS 都没有实现这种“开箱即用”。我说“显然”,因为许多应用程序不希望自动创建父记录,因为这只会导致数据库被垃圾填充,因此将其作为默认数据库行为是不可接受的。
如果您的目标是将应用程序逻辑的实现卸载到数据库(有些人可能会反对这个想法,而其他人可能会接受),您可以通过在数据库中创建程序化对象(例如触发器和存储过程)来实现。在后一种情况下,您的应用程序不会直接将行插入到表中,而是调用数据库存储过程,由数据库存储过程来完成剩下的工作。