Django 最佳实践——迁移数据

Posted

技术标签:

【中文标题】Django 最佳实践——迁移数据【英文标题】:Django Best Practices -- Migrating Data 【发布时间】:2019-01-01 18:45:40 【问题描述】:

我有一个表格,其中包含必须由用户填写的数据。填充此数据后,状态将更改为“已完成”(状态是数据中的字段)。

我的问题是,为要完成的数据创建一个表和另一个包含已完成数据的表是一种好习惯吗?或者我应该只制作一张包含两种类型数据的表格,按状态区分?

【问题讨论】:

添加status会更好,否则会导致数据冗余 好吧,我们总是可以将数据添加到completed 表中并从to_be_completed 表中删除数据,不是吗? 有可能。但是,我认为这不是一个好方法 怎么样?我很想被说服:) 【参考方案1】:

一个表是处理这种特殊情况的最佳方式。两个表要求您在应用程序中强制执行数据完整性和一致性,而不是依赖数据库的功能,这通常是一个非常糟糕的主意。

您应该致力于规范您的数据库(在合理范围内)并尽可能利用数据库的内置约束来避免错误数据,包括重复、冗余和其他不一致。

Here's a good write-up谈几个常见的数据库实现问题。 4 号很好地涵盖了您的 2 桌选项。


如果您确实坚持使用两个表(请不要),那么至少要确保使用人工主键(即:一个不只是 id 的唯一值)来帮助保持完整性。每个表中可能有匹配的 id 整数值匹配,但两个表之间的每个人工主键值应该只有一个版本。但同样,这不是推荐的方法,并且会增加您的应用程序中原本不需要的复杂性。

【讨论】:

【参考方案2】:

不仅仅是 Django

这实际上是一个很好的一般性问题,不一定特定于 Django。但是 Django 通过轻松使用链接表(ForeignKey、ManyToMany)是一个表的一个很好的用例。

一个表或一组表

一张桌子有一些优点:

无需复制数据,只需更改状态字段即可。 如果有链接表,则不需要复制它们 如果您想删除原始数据(即避免保留冗余数据),则无需担心删除链接数据(并以正确的顺序删除)。 如果原始添加和状态更改可能由不同的进程完成,则一张表更安全 - 即,将字段标记为“完成”两次是无害的,但尝试第二次删除/添加可能会导致很多问题.

“或一组表”是这里的关键。 Django 可以很好地处理链接表,但是使用两个单独组链接表来完成所有这些操作会变得很混乱,并且在您更改字段或数据结构时很容易忘记。

【讨论】:

以上是关于Django 最佳实践——迁移数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移 - 永远保留它们?啥是最佳实践?

HBase实践 | HBase TB级数据规模不停机迁移最佳实践

快速云原生化,从数据中心到云原生的迁移最佳实践

最佳实践:使用后如何修改flyway迁移脚本

Openstack迁移DDH最佳实践

JSON数据从OSS迁移到MaxCompute最佳实践