AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 109397
Accepted
algiogia
algiogia
Asked: 2015-08-08 08:09:24 +0800 CST2015-08-08 08:09:24 +0800 CST 2015-08-08 08:09:24 +0800 CST

目录版本控制

  • 772

如果这不是要询问的正确 SE 站点,我们深表歉意。

我正在设计目录管理应用程序。层次结构中的任何元素都必须进行版本控制,即当我更改它的属性时,将创建一个新版本。新版本也可以有与以前不同的孩子。用户在管理目录时可以在版本之间切换,因此我需要列出子项的所有现有版本。切换版本时,将更新所有后代)。

我的第一个想法是

| A            |  | B            |  | C            |
|--------------|  |--------------|  |--------------|
| ID  (k)      |  | ID  (k)      |  | ID  (k)      |
| VER (k)      |  | VER (k)      |  | VER (k)      |
| ...          |  | A_ID (fk)    |  | B_ID (fk)    |
|              |  | A_VER (fk)   |  | B_VER (fk)   |
|--------------|  | ...          |  | ...          |
                  |--------------|  |--------------|

实体的键总是类似于 (ID, VER) 而父级的 fk 是 (P_ID, P_VER)。

这是实施它的好方法吗?

更新:显然比这更复杂。版本控制的意思是元素有有效期,我们需要保留旧版本。例如,客户购买价格为 x 的产品。1 月 1 日之后,它将花费 y。1 月 1 日之后的新客户获得新价格 y,但老客户继续支付 x。

添加时间戳列可能是这里的最佳选择。

data-versioning
  • 1 1 个回答
  • 188 Views

1 个回答

  • Voted
  1. Best Answer
    Erik
    2015-08-08T15:17:15+08:002015-08-08T15:17:15+08:00

    老实说,您的要求听起来像是噩梦和版本控制系统之间的交叉。我强烈建议查看像Git这样的流行解决方案,而不是使用关系数据库重新实现DVCS 。您的应用程序可以有效地成为 Git 的漂亮皮肤。 如果您必须通过关系数据库执行此操作,那么我认为按时间戳进行版本控制将是您成功的最佳机会。

    基本策略是在每个实体上放置时间戳。然后,当您需要转到最新版本时,您可以通过具有最新时间戳的关系链选择所有实体。当您需要获取特定版本时,您可以获取处于或早于所需版本时间戳的实体的所有最新版本。

    按时间戳进行版本控制可防止您将所有旧实体复制到新版本 ID,即使这些实体没有更改也是如此。它还可以让您避免跟踪那些版本 ID 的疯狂行为。

    这可能会导致查询时间变慢,但您可以尝试一下,看看它是否适合您的需要。重申一下,我不认为关系数据库是最好的解决方案,但有时生活会迫使我们将方钉放在圆孔中。如果那是你一生中的命运,我祝你一切顺利。

    编辑:版本控制与历史定价有关

    我同意时间戳是可行的方法,因为版本控制与历史定价有关。要处理这个问题,您只需要一个有效开始日期列。要查找任何时间点的汇率,您只需找到不在未来的最近日期。例如:

    declare @Date DATE = SYSUTCDATETIME(); -- Or any other date for historical/future data
    ;with [CurrentPrice_CTE] AS -- You don't really need this semi-colon but I added it as a defensive habit.
    (
        select
          [PriceId] -- Price table's PK
          max([EffectiveStartDate]) AS [EffectiveStartDate]
        from [dbo].[Price]
        where
          [EffectiveStartDate] <= @Date
    )
    select
      [p].* -- Select the columns you need
    from [dbo].[prices] [p]
        inner join [CurrentPrice_CTE] [cp] as [cp].[PriceId] = [p].[PriceId] and [cp].[EffectiveStartDate] = [p].[EffectiveStartDate]
    

    只需确保为每个产品设置唯一的开始日期,否则该代码将返回比您想要的更多的结果。老实说,这听起来比每次更新都必须还原整个数据库要简单得多。:)

    • 1

相关问题

  • 一组日期时间版本化的行,如何构建最新的行

  • 数据历史表与使用当前记录标志 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve