Atualmente estou tentando ver como os recursos orientados a objetos entram em jogo no Postgres. Durante alguns testes, notei que quando você insere ou exclui de tabelas herdadas, essas alterações também acontecem na supertabela e vice-versa.
Pergunta 1: Como os dados são armazenados fisicamente se você tiver 2 tabelas e a tabela 1 não tiver restrições, mas a tabela 2 tiver uma coluna de chave primária de identidade e também herdar colunas da tabela 1.
Pergunta 2: Como uma tabela herda colunas da outra e as inserções na tabela 2 resultam também na população da tabela 1, os dados armazenados são completamente isolados e redundantes em duas tuplas diferentes em páginas diferentes ou as tuplas estão vinculadas de alguma forma? E se estiver separado, isso significa que ambas as tuplas ficam bloqueadas no caso de uma operação de escrita?
Pergunta 3: Como um índice afeta a herança da tabela?
Pergunta 4: Qual é o uso real dos recursos orientados a objetos no Postgres?
As tabelas utilizadas:
create table person (
nachname varchar(30),
age int,
eigenschaft varchar(30)
)
create table praktikant (
praktikant_id int generated always as identity primary key,
klassenstufe int) inherits(person);
a inserção:
insert into praktikant(nachname, age, eigenschaft, klassenstufe)
values('Schmidt', 16, 'fleißig', 9)
As duas tabelas
person
epraktikant
no seu exemplo são duas tabelas distintas. Inserir linhas empraktikant
não insere linhas em , masperson
é efetivamente o mesmo que
Observe a
EXPLAIN
saída de ambas as consultas para confirmar isso.Cada uma dessas tabelas tem suas próprias restrições e índices, que não afetam a outra tabela.
Então as respostas para suas perguntas seriam:
As tabelas são completamente independentes, exceto que
praktikant
deve ter todas as colunas deperson
a consulta
person
incluirá linhas depraktikant
Essa pergunta não é muito clara, mas suponho que você possa respondê-la a partir do acima. Os bloqueios são feitos nas linhas de cada tabela de forma independente.
De jeito nenhum. Além disso, uma restrição em uma tabela não afeta a outra tabela. Especificamente, você não pode garantir a exclusividade das entradas nas duas tabelas.
Existem poucos usos no mundo real. Antes do advento do particionamento declarativo na v10, ele era usado para implementar o particionamento no PostgreSQL.