gpt4 book ai didi

postgresql - 在 PostgreSQL 中创建 "table of tables"或实现类似功能?

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

我刚刚开始使用 PostgreSQL,而且我是数据库设计的新手。

我正在编写软件,其中有各种更新数据库的插件。每个插件定期更新数据库中自己指定的表。因此,名为“KeyboardPlugin”的插件将更新“KeyboardTable”,而“MousePlugin”将更新“MouseTable”。我希望我的数据库在执行引用完整性的同时存储这些“插件表”关系。所以理想情况下,我想要一个包含以下列的配置表:

  1. 插件名称(输入“文本”)
  2. 表名(类型?)

我的软件将从这个配置表中读取,以帮助插件确定更新哪个表。最初,我的想法是让第二列(表名)的类型为“文本”。但是,如果有人输入错误的表名,或者现有关系因有人删除表而变得无效,我们就会遇到问题。我希望“表名”列充当对另一个表的引用,同时强制执行参照完整性。

在 PostgreSQL 中执行此操作的最佳方法是什么?随意建议一种全新的方式来设置我的数据库,这与我目前正在探索的方式不同。此外,如果它可以帮助您回答我的问题,我正在使用 pgAdmin 工具来设置我的数据库。

感谢您的帮助。

最佳答案

我会按照您最初的计划将名称存储为文本。可能通过额外存储模式名称来增强:

 addin text
,sch text
,tbl text

表在系统目录 (pg_catalog.pg_class) 中有一个 OID。你可以得到带有 nifty special cast 的那些:

SELECT 'myschema.mytable'::regclass

但是 OID 可以通过转储/恢复进行更改。因此,只需将名称存储为文本,并像在应用程序时演示的那样通过转换它来验证表是否存在。

当然,如果您将每个表用于多个插件,则可能需要制作一个单独的表

CREATE TABLE tbl (
,tbl_id serial PRIMARY KEY
,sch text
,name text
);

并在...中引用它

CREATE TABLE addin (
,addin_id serial PRIMARY KEY
,addin text
,tbl_id integer REFERENCES tbl(tbl_id) ON UPDATE CASCADE ON DELETE CASCADE
);

如果插件有多个表,甚至可以将其设为 n:m 关系。但请注意,正如@OMG_Ponies 评论的那样,像这样的设置将需要您执行大量动态 SQL,因为您事先不知道标识符。

关于postgresql - 在 PostgreSQL 中创建 "table of tables"或实现类似功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8162597/

25 4 0