gpt4 book ai didi

sql - 像数据库行的引用计数或共享指针之类的东西?

转载 作者:行者123 更新时间:2023-11-29 11:46:08 25 4
gpt4 key购买 nike

首先,我使用的是 Postgres 9.1。

我有一个名为文件路径的表和其他表,这些表的行指向其相应文件路径的 ID。是否有一种通用的设计方法来对文件路径进行引用计数,以便在删除其他行并且不再有对特定文件路径行的任何引用时,也可以将其删除?

例子:

    [filepaths]
1 | c:\windows\system32\test.exe
2 | c:\windows\calc.exe

[events_2011_08_30]
[1][timestamp][other data] [ filepaths = 1]
[2][timestamp][other data] [ filepaths = 2]

[events_2011_08_31]
[1][timestamp][other data] [ filepaths = 1]

所以我会将数据存储在表中以对其进行分区,并且我想删除超过 30 天的旧表(仍将它们存档)。在上面的例子中,我们假设只有那两个 events_ 表。如果我删除 2011_08_30,我希望有一种方法可以知道没有任何内容指向文件路径“2”,因此将其删除,但知道有一行仍指向文件路径“1”,因此保留它。

有什么想法、建议等吗?我相信我读过的一些策略,至少对于 postgres 和触发器,仍然存在关于哪个线程首先锁定主键列和其他相关问题的竞争条件。

谢谢!

最佳答案

首先,我要挑战将每个日期的数据分区到一个表上的愿望。相反,我建议您只在表中有一列名为 effective_date 或类似名称的列。


文件路径的引用计数而言,可以通过多种方式实现,但为了确保代码的封装,我推荐以下两种方法之一......

<强>1。存储过程 API

通过确保所有 INSERT、UPDATE 和DELETE 操作都通过存储过程进行处理,您还可以在文件路径 上封装引用计数器的递增和递减。然后,没有用户/登录名需要访问表以进行写入事件,而他们只需使用存储过程。

<强>2。触发器

可以在每个events表上创建触发器来封装引用计数器递增和递减代码。每当修改表内容时,触发器都会触发并传播您的业务逻辑的结果。

许多人回避触发器,因为他们觉得触发器被隐藏起来,并且如果过度使用可能会产生复杂的交互。但是,我认为它们非常有用。

在任何一种情况下,只有一个表而不是多个表,一切都大大简化了。

此外,大多数 SQL 设计模式都没有将“删除表”视为“一切照旧”操作。在我看来,创建或删除表应该被视为设计更改,而不是数据事件。

关于sql - 像数据库行的引用计数或共享指针之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com