用于更新下游源的数据库架构?

时间:2014-12-16 14:37:57

标签: sql postgresql database-design

我想让一个表可以通过Web API进行同步。

例如,

GET /projects?sequence_latest=2113&limit=10

[{"state":"updated", "id":12,"sequence":2116},
{"state":"deleted" "id":511,"sequence":2115}
{"state":"created", "id":601,"sequence":2114}]

实现这一目标的好方法是什么?

我打算使用Django ORM 的Postgresql,它使用代理键。 ORM的存在可能会杀死像工会这样的答案。


我只能提出半解决方案。

  1. 我可以有一个modified_time列,但我们无法传达删除。

  2. 我可以有一个用于存储已删除ID的表,当返回10个新的/更新的行时,我可以返回它们之间的所有已删除的行。但这仅适用于最新更改是插入/更新且存在适度数量的已删除行的情况。

  3. 我可以在行上设置一个已删除的标志,并将其余部分设为空,但是它有点糟糕的架构设计可以将所有列设置为可为空。

  4. 我可以有另一个存储ID,修改序列号和状态(新的,更新的,删除的)的表,但是另一个用于维护和设置序列号的表会导致争用;想象n并发请求查询最新ID。

1 个答案:

答案 0 :(得分:1)

如果您正在使用ORM,则需要简单(ish),如果您通过API快速提供数据。

完成建议的选项:

  1. 正确,所以这对你没有帮助。你可以在主表中删除一个标志。
  2. 这似乎是一种随意的方式,并且打破了你没有UNION查询的坚持。
  3. 不确定为什么你需要在这里列的其余部分为NULL?这带来了什么好处?
  4. 我强烈建议不要让表格有修改序列号。这意味着您要执行大量分析查询以查找最新状态,或者您多次更新相同的行并维护一个与您的普通PK相同的表。此时,您可能还在主表中删除了一个标记。
  5. 基本上,API的设计为您提供了一个简单的选择;你应该拥有同一个表中的所有内容,因为所有数据都是通过相同的方法返回的。我会按照您的第2点和Wolph's suggestion,在您的表格中添加deleted_on列;使它看起来像:

    create table my_table ( 
         id ... primary key
       , <other_columns>
       , created_on date
       , modified_on date
       , deleted_on date
         );
    

    我甚至不愿意将所有其他列更新为NULL。如果要确保不返回任何数据,请在表的顶部创建一个视图,该视图会使deleted_on列中包含数据的数据为空。然后,您的API仅通过视图访问该表。

    如果您真的真的担心空间记录量将执行常规数据库维护以确保两者都受控制然后可以使用选项4.创建第二个表,其中包含主表中每个ID的状态,并实际从主表中删除数据。然后,您可以对主表执行LEFT OUTER JOIN以获取数据。没有数据时,ID已被删除。老实说,直到你知道你是否肯定会要求它为止,这是过度的。

    您没有提到为什么使用Web API进行数据传输;但是,如果您要传输大量数据或将其用于内部系统,则可能需要使用较低级别的传输机制。