在生产环境中从mysql迁移到nosql数据库,无需更改代码,无需外键和索引

在生产环境中从mysql迁移到nosql数据库,无需更改代码,无需外键和索引,mysql,database-design,architecture,database-migration,Mysql,Database Design,Architecture,Database Migration,我这里有两种情况: 在不更改代码的情况下将mysql数据库迁移到nosql(不使用ORM) 在mysql中不使用外键和索引(因为它们希望将来迁移到不同的数据库) 3.所有这些都是通过很少的代码更改来完成的 这些问题是由我的团队负责人提出的。所以我没有一个正确的答案给他,因为我觉得在没有索引和外键的情况下做mysql是不太可能的,首先,如果他们不打算使用mysql,那么他们为什么选择这样做呢 我想知道,软件行业的人都喜欢这样 通常,或者他们会根据自己的需要选择合适的 他们说外键验证是由api级别完

我这里有两种情况:

  • 在不更改代码的情况下将mysql数据库迁移到nosql(不使用ORM)
  • 在mysql中不使用外键和索引(因为它们希望将来迁移到不同的数据库) 3.所有这些都是通过很少的代码更改来完成的
  • 这些问题是由我的团队负责人提出的。所以我没有一个正确的答案给他,因为我觉得在没有索引和外键的情况下做mysql是不太可能的,首先,如果他们不打算使用mysql,那么他们为什么选择这样做呢

  • 我想知道,软件行业的人都喜欢这样 通常,或者他们会根据自己的需要选择合适的
  • 他们说外键验证是由api级别完成的 不是mysql级别的

  • 我不理解他们,因为我经验不足,所以我不知道他们为什么这样说。请让我了解一下这是否是一个好的做法?

    我认为不添加代码是不可能的-您需要以某种方式实现nosql dB引擎如何管理数据。如果项目的编码明确区分了业务逻辑和数据库代码,那么只需使用新的数据库实现而不是旧的数据库实现。如果情况并非如此,并且您的db实现泄漏到您的业务逻辑中,那么在不更改代码的情况下切换是不可能的。根据代码库的大小,它可能/很可能太贵

    如果您想看到将dB逻辑与业务逻辑完全分离的示例,请查看以下存储库: (这不是我的存储库,我今天偶然发现了它)

    如果你想学习和理解驱动设计的原则,从寻找“干净的体系结构”和/或“域驱动设计”开始——在我看来,第一个更容易理解,在YouTube上有一些Robert C.Martin的演讲,你可以在买书之前先看一下

    编辑:我目前正在进行的项目确实从运行在rds上的postgresql更改为使用不同存储库的dynamodb,而没有更改任何现有的业务逻辑。这样可以节省很多钱。因此,是的,更改数据库后端确实会发生,并且是由需求驱动的


    除此之外,当我开始处理一个新的功能集/微服务/有界上下文时,我通常从一个简单的内存存储库实现开始,它使用映射。在我完成了最初的用例集之后,我对db需求有了更多的了解,并根据这些需求和一般需求选择db引擎,以限制使用的不同技术的数量

    不确定是否要从MySQL迁移到nosql,但一些nosql数据库不支持事务管理以提高速度。外键验证由MySQL完成。如果不是,你会遇到很多正直的人errors@PraveenE如果外键验证由代码完成,会发生什么?如果我们不使用外键,那么获取操作将花费这么多,对吗?这还不清楚。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。“给我一些见解”不是一个主题问题。关于关系型和非关系型DBs和DBMS,有很多问题和答案,为什么这不是一个重复?PS通过编辑而不是注释进行澄清。FKs不是数据库的要求。有效的代码不需要FK,特别是当代码正在执行等效的FK检查时。特别写查询是FK用于捕捉错误的地方。索引不是一项要求,但性能会受到影响。对于微小的数据集,这并不重要;对于大型数据集来说,这是致命的。“如果不索引”+“非常巨大”=“灾难”,不使用外键关系和其他索引方法(如mysql中的unique key)会有什么后果。是否存在任何问题。索引的方式取决于存储库的实现细节,因此取决于存储库使用的数据库引擎。索引用于以高效/快速的方式定位数据。它们还用于验证数据的完整性,用户表中的电子邮件地址是唯一的就是一个突出的例子。通常,您希望在业务逻辑中处理尽可能多的业务规则,而在业务逻辑中无法处理的规则则必须由存储库处理—就像对10万行数据的唯一约束一样。外键是必需的,或者是数据规范化的结果。后者并不是那么重要,因为在大多数情况下,数据复制是可以接受的,因为数据复制可以减少耦合,有时甚至带来性能优势。当用于引用另一个业务实体而不是聚合根(即存储库正在持久化的对象)时,它的职责是再次选择存储库实现完全不使用它们或如何处理它们。引用其他聚合根的外键更复杂。在微服务领域,这将是另一个服务返回的id。具有对另一个服务聚合根的引用的服务通常(不希望)具有对其他服务数据库引擎的访问权限。因此,在修改数据时,您的服务需要处理不一致的外键或使用一些分布式事务的实现。分布式sagas能够处理最复杂的场景,本地sagas可能会做到这一点,或者是一个简单的不支持操作异常-取决于您的使用情况我不知道您的服务,但您提出的问题让我相信您正在使用以DB为中心的单片应用程序。这些项目通常是DB引擎的奴隶,不会奴役DB引擎。迁移/重构这些代码库通常非常昂贵。如果你是那个行动的负责人,我会