我们有一个使用Flask / Pony框架构建的单一应用程序。它现在很好用。
然而,在不久的将来,我们将开始转向微服务架构。在这个过程中,我们很可能每个服务都有一个单独的Db。由于我不会涉及的一些原因,这是有益的。但是当我想到桌子之间形成的外键关系时,我会挂断电话,而且我也知道其他人也会这样做。
人们已经通过对其数据库进行非规范化来解决这个问题,并最终在另一个服务的数据库中使用了重复的表。
我很好奇小马的用户对此解决方案的看法以及它是否可行。
在使用微服务架构时,还有其他人使用PonyORM或任何其他ORM吗?
编辑:
我们的数据库现在很简单:
Main DB
User
|-id
|-name
|-role = Required("Role")
Role
|-id
|-name
|-set("User")
现在这一切都在一个Db中,但逻辑在两个不同的服务中。用户服务和角色服务。角色服务控制允许用户访问的授权和视图。
理想情况下,我想将这些分成单独的Db,但仍然能够保持两者之间的关系。我不认为它可以通过自然的SQL查询/索引来完成(或者可以吗?)。
答案 0 :(得分:2)
首先,我应该注意,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。以下是有趣文章的几个链接及其对HN的讨论: The End of Microservices,Enough with the microservices,Modules vs Microservices。
但是你已经提到有这个举动的理由。在这种情况下,您无法避免两个数据库中的某些数据重复。拆分原始数据库的一种可能方法如下:
第一个数据库将包含SELECT *,u.user_name AS user_name,...
和User
个实体,但Role
实体只有最少数量的属性 - Role
和{{1} }。
第二个数据库将没有id
实体,只有name
实体,其中包含此角色提供的有关权限的完整信息。第二个数据库中User
个对象的Role
和id
属性应该与第一个数据库中的name
和Role
属性具有相同的值。
这样,User
和Role
实体之间的关系不会被破坏,因为它们属于同一个数据库。这有助于保持数据完整性。同时,将会有一些操作需要在两个数据库中进行同步更改 - 角色创建,重命名和删除。为此,您可以先在Role微服务中进行更改,然后将相应的请求发送到User微服务。但是你需要实现一个逻辑,确保两个更改都没有错误,如果第二个更改没有成功,则重试或回滚。