在 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' 列,它指向它需要用来确定用户需要监视的警报集的配置。
- 我考虑过向警报添加订阅列 table,它只是订阅的 ID 的 array/list,但 SQL 不存储数组或列表。
- 我也想过有一个配置 table 详细说明每个配置的名称和它关心的警报,但是你 运行 陷入同样的问题 - 你如何告诉它哪些警报它没有 array/list?
的引用
- 我也考虑过每次有人创建新配置时生成一个新的 table,但阅读告诉我这是一个非常糟糕的主意,我什至不知道如何做这样的事情。
- 我还考虑过使用
IN(<list>)
方法在数据库查询中解析列表,但是当列表超过 ~900 个元素时会出现内存错误,因此您需要对请求进行批处理。而且它不是真正的关系型,所以速度很慢。
关于如何解决这个问题的任何指示?
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 中使用它感觉如何。
我们有一个使用 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' 列,它指向它需要用来确定用户需要监视的警报集的配置。
- 我考虑过向警报添加订阅列 table,它只是订阅的 ID 的 array/list,但 SQL 不存储数组或列表。
- 我也想过有一个配置 table 详细说明每个配置的名称和它关心的警报,但是你 运行 陷入同样的问题 - 你如何告诉它哪些警报它没有 array/list? 的引用
- 我也考虑过每次有人创建新配置时生成一个新的 table,但阅读告诉我这是一个非常糟糕的主意,我什至不知道如何做这样的事情。
- 我还考虑过使用
IN(<list>)
方法在数据库查询中解析列表,但是当列表超过 ~900 个元素时会出现内存错误,因此您需要对请求进行批处理。而且它不是真正的关系型,所以速度很慢。
关于如何解决这个问题的任何指示?
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 中使用它感觉如何。