在 SQLAlchemy 中使用数组的替代方法

Alterative to using arrays in SQLAlchemy

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

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

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

Alarms table 就像要监视的警报的主列表,History table 只是从外部监视服务接收到的警报数据的历史变化列表,用户 table 是不言自明的。

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

更改它

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

关于如何解决这个问题的任何指示?

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

你说一个用户属于一个组甚至组(这个不清楚)。所以我希望有一组 table。如果用户属于一个组,您将向用户 table 添加 group_id。如果一个用户可以属于多个组,您将添加 user_group 网桥 table。

一个组有默认闹钟。由于一个组可以有多个默认警报,并且一个警报可能是许多组的默认警报,因此您将有一个 m:n 关系,这意味着桥接 table group_alarm.

用户最终决定订阅哪些闹钟。另一个 m:n 关系,另一个桥梁 table:user_alarm.

数据库结构到此为止,已经够简单了。

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

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

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