Pra*_*ash 5 postgresql database-design
我有一个数据库来保存有关projects
.
项目有大量与它们相关的数据,这些数据被分割到其他表中,例如project_contacts
和project_images
。这些是一对多关系,其中 1 个项目可以有多个联系人和多个图像。
但是,我需要能够保留项目的“版本”。因此,如果更新了项目,则有关该项目的先前数据仍然存在。这是多对多关系的一个大问题。例如,有一个categories
表,一个project_categories
表——很多项目可以有很多类别。
当一个项目更新时,并不是每条数据都会更新。例如,如果一个项目有一个新联系人,它不会总是有一个新图像,因此图像表不会更新。
我考虑过的一种解决方案是拥有一个versions
带有自动递增 ID的表;一project_id
列和一time
列。每个表也将获得一version_id
列。每当更新项目时,都会在versions
. 然后,当表被更新时,version_id
也会被输入。这意味着有关项目的最新行project_images
可能是 3,而最新版本project_contacts
可能是 27。
由于version_id
是递增的,因此获取单个项目的最新版本非常简单,因为您可以按最高version_id
.
这个想法对我来说似乎失败的地方是,如果我想从特定日期获取项目的版本。
我可以使用我当前的解决方案来解决这个问题吗?
小智 1
一种可能的方法是在索引表上创建 date_time 列和 version_id 列,基本上就是您所描述的。不过,您应该做出的区别是,每当 version_id 增加时,都会将新数据插入到所有与项目相关的表中。像这样的 psuedoSQL...
insert <current date_time>, (select MAX(version_id) from versions)+1 into versions
insert (select (* - version_id - <data that is being updated>) from project),updating_column=new_data, (select MAX(version_id) from versions) into <project related tables>
Run Code Online (Sandbox Code Playgroud)
这是思考这个问题的基本方法,但这可能会引导您走上正确的道路。这个概念的主要缺点是,您有大量数据在运行,这些数据本质上是冗余的,但在逻辑上很容易实现。
考虑这种关系的另一种更智能的存储方式是跟踪更新了哪些数据。您的版本表现在将具有一个外键列,用于存储可能作为项目的一部分进行更新的所有数据,以及一个 version_id 主键。您无需将 version_id 插入到项目表中,而是插入 column_version_id。
这个想法在概念上是这样运作的。当您查询某个时间点的所有数据时,您将首先访问版本表。从那里它将根据 column_version_id 连接所有项目表。
虽然这个概念具有更好的存储能力,但逻辑上有更多的移动部分,而且随着项目数据管理方式的变化,灵活性也较差。
归档时间: |
|
查看次数: |
3626 次 |
最近记录: |