我想让一个表可以通过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的存在可能会杀死像工会这样的答案。
我只能提出半解决方案。
我可以有一个modified_time列,但我们无法传达删除。
我可以有一个用于存储已删除ID的表,当返回10个新的/更新的行时,我可以返回它们之间的所有已删除的行。但这仅适用于最新更改是插入/更新且存在适度数量的已删除行的情况。
我可以在行上设置一个已删除的标志,并将其余部分设为空,但是它有点糟糕的架构设计可以将所有列设置为可为空。
我可以有另一个存储ID,修改序列号和状态(新的,更新的,删除的)的表,但是另一个用于维护和设置序列号的表会导致争用;想象n并发请求查询最新ID。
答案 0 :(得分:1)
如果您正在使用ORM,则需要简单(ish),如果您通过API快速提供数据。
完成建议的选项:
基本上,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进行数据传输;但是,如果您要传输大量数据或将其用于内部系统,则可能需要使用较低级别的传输机制。