首页 > 解决方案 > 在 SQLAlchemy 中使用数组的替代方法

问题描述

我们有一个使用 sqlalchemy 创建的数据库,其中包含这些表(以及其他):

users                      alarms                       alarm_history
+---------+-----------+    +----------+------------+    +----------+-----------+------------+
| user_id | user_name |    | alarm_id | alarm_name |    | alarm_id | timestamp | alarm_data |
+---------+-----------+    +----------+------------+    +----------+-----------+------------+

可能值得指出的是,这些表中还有很多其他数据,这是一个缩写版本,alarm_id 是通过外键关联的。还有许多其他具有关系的表。

Alarms 表就像要监控的警报的主列表,History 表只是从外部监控服务接收到的警报数据的历史更改列表,而 users 表是不言自明的。

我们需要做的是有一个用户订阅的警报的默认列表(由于他们所属的组),而且还能够选择订阅或取消订阅哪些警报。这必须是可即时管理的——他们可以随时通过 API 进行更改。

我应该如何将这些配置存储在数据库中?然后的想法是在用户表中有一个“订阅”列,它指向它需要用来确定用户需要监控的警报集的配置。

有关如何解决此问题的任何指示?

标签: database-designsqlalchemy

解决方案


数组很少在 RDBMS 中使用。原因很明显:关系数据库系统已经将关系存储在表中,那么为什么要添加仅表示 1:n 关系的数组而没有外键一致性和快速索引查找的数据库优势呢?

你说一个用户属于一个组甚至组(这不清楚)。所以我期待一个组表。如果用户属于一个组,您将group_id在用户表中添加一个。如果用户可以属于多个组,您将添加一个user_group桥接表。

组具有默认警报。由于一个组可以有多个默认警报,而一个警报可能是多个组的默认警报,因此您将有一个 m:n 关系,这意味着一个桥接表group_alarm

用户最终决定订阅哪些警报。另一个 m:n 关系,另一个桥表:user_alarm.

到目前为止,对于数据库结构来说,这已经足够简单了。

现在回到逻辑:您希望默认订阅警报。这意味着您在将组分配给用户时将默认警报分配给用户。这可以通过将警报从应用程序复制group_alarmuser_alarm应用程序或由应用程序复制的触发器来完成。触发器会自动且无声地执行此操作。应用程序也可以静默执行此操作,也可以提供复选框列表,因此可以显式完成订阅/取消订阅。

当警报作为默认值添加到组时,我想您不希望发生任何事情。我想这只会影响新的用户/组关联。或者您想将此警报添加到用户警报中吗?如果是这样,再次触发可能是合适的。

我不知道 SQLAlchemy。它是一个 ORM,并且 ORM 倾向于尝试将 RDBMS 提供的关系网络转换为树结构,这必然会导致妥协,包括不太方便和更慢的数据访问。突然之间,您被迫使用单纯的编程语言来查询数据,而不是使用 4GL 查询语言。因此,虽然上述结构是合适的数据库,但我不知道在 SQLAlchemy 中使用它会有什么感觉。


推荐阅读