Pony ORM和微服务架构

时间:2017-05-31 15:30:15

标签: database-design architecture ponyorm

我们有一个使用Flask / Pony框架构建的单一应用程序。它现在很好用。

然而,在不久的将来,我们将开始转向微服务架构。在这个过程中,我们很可能每个服务都有一个单独的Db。由于我不会涉及的一些原因,这是有益的。但是当我想到桌子之间形成的外键关系时,我会挂断电话,而且我也知道其他人也会这样做。

人们已经通过对其数据库进行非规范化来解决这个问题,并最终在另一个服务的数据库中使用了重复的表。

我很好奇小马的用户对此解决方案的看法以及它是否可行。

在使用微服务架构时,还有其他人使用PonyORM或任何其他ORM吗?

编辑:

我们的数据库现在很简单:

Main DB
User
|-id
|-name
|-role = Required("Role")
Role
|-id
|-name
|-set("User")

现在这一切都在一个Db中,但逻辑在两个不同的服务中。用户服务和角色服务。角色服务控制允许用户访问的授权和视图。

理想情况下,我想将这些分成单独的Db,但仍然能够保持两者之间的关系。我不认为它可以通过自然的SQL查询/索引来完成(或者可以吗?)。

1 个答案:

答案 0 :(得分:2)

首先,我应该注意,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。以下是有趣文章的几个链接及其对HN的讨论:     The End of MicroservicesEnough with the microservicesModules vs Microservices

但是你已经提到有这个举动的理由。在这种情况下,您无法避免两个数据库中的某些数据重复。拆分原始数据库的一种可能方法如下:

  1. 第一个微服务和相应的数据库负责用户及其拥有的角色集。
  2. 第二个微服务回答了“哪些权利赋予了特定角色”的问题。
  3. 第一个数据库将包含SELECT *,u.user_name AS user_name,...User个实体,但Role实体只有最少数量的属性 - Role和{{1} }。

    第二个数据库将没有id实体,只有name实体,其中包含此角色提供的有关权限的完整信息。第二个数据库中User个对象的Roleid属性应该与第一个数据库中的nameRole属性具有相同的值。

    这样,UserRole实体之间的关系不会被破坏,因为它们属于同一个数据库。这有助于保持数据完整性。同时,将会有一些操作需要在两个数据库中进行同步更改 - 角色创建,重命名和删除。为此,您可以先在Role微服务中进行更改,然后将相应的请求发送到User微服务。但是你需要实现一个逻辑,确保两个更改都没有错误,如果第二个更改没有成功,则重试或回滚。