AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[inheritance](dba)

Martin Hope
User1974
Asked: 2021-02-09 20:08:50 +0800 CST

为什么选择 Oracle 对象的属性需要别名?

  • 0

我的 GIS 软件有一个名为ST_GEOMETRY的 Oracle 18c 对象类型。

对象类型具有属性:

空间类型的属性表示以下信息:

  • 实体:存储在空间列中的几何特征类型(线串、多线串、多点、多面、点或多边形),其值是从 st_geom_util 存储过程派生的位掩码。
  • Numpts:定义几何的点数;对于多部分几何,这包括每个部分之间的分隔符,每个分隔符一个点。
  • Minx, miny, maxx, maxy:几何的空间包络
  • 面积:几何的面积
  • Len:几何体的周长
  • SRID:包含将其链接到 ST_Spatial_References 表中其关联空间参考(坐标系)记录的几何标识符
  • Points:包含定义几何的点坐标的字节流

我可以使用以下两种方法之一选择对象的属性:

  1. 使用 Oracle 的TREAT()函数。
select 
    treat(shape as sde.st_geometry).numpts as num_points
from 
    a_test_table

NUM_POINTS
----------
        37
       161
  1. 或者我可以简单地使用别名:
select 
    a.shape.numpts as num_points
from 
    a_test_table a

NUM_POINTS
----------
        37
       161

问题:

为什么需要使用别名从 Oracle 对象中选择属性?

如果我要删除别名...

select 
    shape.numpts as num_points
from 
    a_test_table

然后我会得到一个错误:

ORA-00904: "SHAPE"."NUMPTS": invalid identifier
oracle inheritance
  • 2 个回答
  • 72 Views
Martin Hope
Sven M.
Asked: 2020-10-13 12:18:29 +0800 CST

在 PostgreSQL 中为每个类型的表建模

  • 0

我已阅读以下文章如何有效地建模数据库中的继承?关于数据库中的继承。不幸的是,我在 Packt 的 PostgreSQL 书籍中找不到任何东西。现在我有点困惑,如果我的方法是矫枉过正,甚至不属于数据库或有意义(见最后我的考虑)。

首先,我想使用Table-Per-Concrete来实现以下示例。但是后来我读了几次,你应该只在你真的有性能问题时才这样做,并且只要你没有性能问题,就应该使用每种类型的表。

所以给出以下关系:

system_user (system_user_id, type, first_name, last_name, ...)

user (system_user_id) *Has no unique attributes but special relations accessible only for him, e.g. orders
customer (system_user_id, company_name, ...)
supporter (system_user_id, nickname, ...)

到目前为止一切顺利,但我想知道如何在上面的示例中确保:

  • 类型不能更改。
  • 一个 system_user 在一个扩展中最多有一个条目。

我的考虑:

  • 如果在 UPDATE 期间更改类型,则会引发错误的触发器。
  • 每个扩展都有一个触发器,它在插入之前检查是否具有此 system_user_id 的条目已存在于另一个扩展中。

这有意义吗?还是我走错了路?这甚至有必要吗?我应该直接为每个实体创建一个单独的关系吗?

也许我对它有太多的面向对象软件开发人员的看法。非常感谢你的回答。

postgresql inheritance
  • 1 个回答
  • 165 Views
Martin Hope
Cristóbal Ramos Merino
Asked: 2020-04-01 09:53:28 +0800 CST

PostgreSQL 10.6:更改父表会阻止所有子表吗?

  • 0

我想在近 74.000 个子表中添加一列。这些表几乎实时地不断地从公司的所有服务中插入和读取。如果我向父表添加一列,它将阻止 74.000 个表,还是一对一?

postgresql inheritance
  • 1 个回答
  • 86 Views
Martin Hope
James Healy
Asked: 2020-01-17 06:04:20 +0800 CST

我可以改进 pg_dump 导出继承表的方式吗?

  • 1

给定一个具有某些表继承的 postgresql 12 数据库,并且子表不添加其他列:

CREATE TABLE parent (
    id integer NOT NULL PRIMARY KEY,
    name text NOT NULL
);

CREATE TABLE child () INHERITS (parent);

如果我运行 pg_dump(带pg_dump foo),导出中的表如下所示:

CREATE TABLE public.parent (
    id integer NOT NULL,
    name text NOT NULL
);

CREATE TABLE public.child (
)
INHERITS (public.parent);

如果我然后分离并重新连接孩子:

$ psql foo
psql (12.1 (Debian 12.1-2))
Type "help" for help.

foo=# ALTER TABLE child NO INHERIT parent;
ALTER TABLE

foo=# ALTER TABLE child INHERIT parent;
ALTER TABLE

...并尝试另一个 pg_dump,导出已更改。子表现在显式列出了从父表继承的列:

CREATE TABLE public.parent (
    id integer NOT NULL,
    name text NOT NULL
);

CREATE TABLE public.child (
    id integer,
    name text
)
INHERITS (public.parent);

我能做些什么来让 pg_dump 输出没有显式列的子表吗?

这听起来像是一个人为的例子,但我有一个多 Tb 数据库,它的子表在时间的迷雾中被分离和重新连接,我希望模式导出恢复到简单(并且可读) 尽可能。

特别是,如果每个人一眼就能看到子表没有添加额外的列,那就太好了。

postgresql inheritance
  • 1 个回答
  • 249 Views
Martin Hope
TYL
Asked: 2018-01-24 18:40:31 +0800 CST

如何列出从父表继承的所有表?

  • 0

我有3 tables (janitor, security & manager)哪个继承自user table. 在此处输入图像描述

什么查询可用于产生以下结果(列出所有子表的名称)? 在此处输入图像描述

谢谢你。加油:)

mysql inheritance
  • 1 个回答
  • 1551 Views
Martin Hope
Vestin
Asked: 2017-01-08 09:38:01 +0800 CST

“字典表”的继承

  • 2

(以防万一:我正在使用 SQLite)

我愚蠢的小数据库有数量惊人的相同结构的表:

CREATE TABLE GTag (
    ID            INTEGER PRIMARY KEY NOT NULL,
    Name          TEXT    UNIQUE      NOT NULL,
    Description   TEXT
);

回到这里(波兰),它们被称为“字典表”(“tabele słownikowe”);我找不到合适的英语对应词。它们的作用是提供有限数量的预先确定的选择,通常是下拉框之类的。存储标签似乎是它们设计用来处理的事情。

当我最终确定数据库的结构时,令我震惊的是所有标签和其他类似标签的实体(如“GStatus”、“SStatus”...)都有这 3 个共同的字段,但没有连接到以任何方式彼此。我应该让它们成为更通用的“标签”表的所有子类型吗?

我看到 3 种解决方案来解决我的困境:

  • 创建一个具有ID、Name、Description的超类型。除了对应于Key.ID的主ID键(即:是外键)之外,所有当前表都变为 EMPTY 。如果我想查找所有GTag ,我从GTag获取所有 ID ,然后从相应的Tag条目获取数据。然而,子类型并没有给图片带来任何新的东西。它们没有任何字段可以将它们彼此或父类型区分开来。
  • 将所有内容转储到一张大Tag超级表中;添加类型字段。因为我从不想要同时来自多个类别的标签,所以所有查询都必须通过类型字段进行过滤。看起来像地狱一样笨重,并且重写非常令人头疼。
  • 把事情放在一边就好了。我避免创建具有所有结构但没有共同意义的无用实体。

我的印象是,试图“整理”我的模式最终会导致它陷入混乱,但我没有经验可以坚定地说出来。我在这里错过了什么?每个解决方案提供哪些可能的好处(和缺点)(在性能、整洁度、遵循设计原则方面......),我最终应该实施哪些?

sqlite inheritance
  • 1 个回答
  • 291 Views
Martin Hope
ratherBeKiting
Asked: 2016-03-03 23:25:19 +0800 CST

MySQL中多态关联的最佳实践

  • 5

我有一个 MySQL 数据库,其中包含 3 个包含主要数据类的表:

 companies (company_id)
 persons (person_id, company_id) 
 loans (loan_id, company_id) 

“贷款”和“人”都属于公司。公司可以有贷款,公司可以有人员(如董事、员工等)

在几种情况下,其他数据可能属于公司、个人或贷款,例如“笔记”。例如,用户可以添加特定于公司、个人或贷款的“注释”。

还有其他示例,例如“地址”和“电话号码”,它们可以属于公司或个人。

我显然希望有一个数据表,例如“笔记”、“地址”和“电话号码”,但是我正在努力寻找将这些数据与公司、人员和贷款联系起来的最佳方式。

让我们在这里使用“笔记”作为示例。

更好的做法是:

1/ Have 3 extra tables linking 'notes' to companies people and loans:

notes(note_id)
persons_notes(person_id, note_id)
companies_notes(company_id, note_id)
loans_notes (loan_id, note_id)

2/ Have a single table 'entities' which has a primary key entity_id used to link all 3 tables:

entities(entity_id)
persons(person_id, entity_id)
companies(company_id, entity_id)
loans (loan_id, entity_id)
notes (note_id, entity_id)

后者在逻辑上是有道理的,但感觉不对,因为个人和公司是与贷款完全不同的一类数据。不知怎的,感觉很脏。

备注和地址将与贷款、个人和公司建立一对多的关系。也就是说,一家公司可能有很多地址或备注。这就是我考虑链接表的原因。

一家公司可以有一个注册地址和无限的交易地址。一个人可以有一个当前地址和以前的地址(如果当前地址少于 3 年)。

在这种情况下,拥有贷款(商业贷款)的是公司。人属于公司,通常是公司的董事。所以,一家公司可以有很多人和很多贷款。

  • 一个公司/个人/贷款每人可以有很多笔记
  • 一个公司/个人可以有多个地址
mysql inheritance
  • 2 个回答
  • 10003 Views
Martin Hope
lpd
Asked: 2015-01-18 03:50:53 +0800 CST

跨postgres中的多个表的部分唯一约束

  • 6

为了在 postgres 中强制执行部分唯一性,创建部分唯一索引而不是显式约束是一种众所周知的解决方法,如下所示:

CREATE TABLE possession (
  possession_id serial PRIMARY KEY,
  owner_id integer NOT NULL REFERENCES owner(owner_id),
  special boolean NOT NULL DEFAULT false
);
CREATE UNIQUE INDEX possession_unique_special ON possession(owner_id, special) WHERE special = true;

这将限制每个所有者在数据库级别拥有不超过一个特殊财产。显然不可能创建跨越多个表的索引,因此该方法不能用于在列存在于不同表中的超类型和子类型情况下强制执行部分唯一性。

CREATE TABLE possession (
  possession_id serial PRIMARY KEY,
  owner_id integer NOT NULL REFERENCES owner(owner_id)
);

CREATE TABLE toy (
  possession_id integer PRIMARY KEY REFERENCES possession(possession_id),
  special boolean NOT NULL DEFAULT false
);

如您所见,在此示例中,较早的方法不允许将每个所有者限制为不超过一个特殊玩具。假设每个财产都必须实现一个子类型,那么在 postgres 中强制执行此约束而又不显着改变原始表的最佳方法是什么?

postgresql inheritance
  • 2 个回答
  • 7737 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve