Posso ter uma tabela como "alias" ou "link simbólico" para outra?

10

Eu tenho duas tabelas com a mesma estrutura, A e B. Um certo aplicativo é escrito para que ele sempre grave os mesmos dados nas duas tabelas.

Após uma discussão com um colega sobre o potencial de economizar espaço no disco, estou pensando se o mysql ou o postgresql tem a capacidade de criar na tabela como um "alias" ou "link simbólico" de outro.

Eu quero que o comportamento seja muito semelhante ao de um link simbólico de arquivo flexível; onde a leitura do próprio link simbólico ou de seu destino produzirá a mesma saída e a gravação em qualquer um deles atualizará o destino.

user50849
fonte
2
Você já pensou em ver a mesa?
No SQL Server, você pode apenas usar uma exibição.
JNK
11
Qual RDBMS? Você marcou MySQL e Postgres. As visualizações funcionarão na maioria dos RDBMSes. Oracle tem sinônimos, que são o mesmo que Unix links simbólicos
Philᵀᴹ
MySQL e Postgres, sim. Também os menciono especificamente no texto. Eu pensei que Views não era exatamente o que eu estava procurando, mas talvez esteja tudo bem. Muito obrigado. Postar algumas respostas :)
user50849
11
e por que você precisa de duas mesas?
miracle173

Respostas:

5

Até onde eu sei, um novo Postgresql permite que você tenha INSTEAD OFgatilhos nas visualizações. Portanto, ter uma tabela, uma visualização como SELECT * FROM table1e INSTEAD OFtrigger para insert, update, deletedeve funcionar para você. Essa abordagem não funcionará no Mysql.

a1ex07
fonte
2

É possível no MySQL (usando apenas o mecanismo de armazenamento MyISAM) criar uma tabela do zero usando links simbólicos. É possível no Linux e Windows (usando hardlinks):

Aqui estão minhas postagens anteriores sobre esse assunto

No entanto, o que você está propondo teria que ser feito fora do MySQL no Linux.

Para este exemplo

  • / var / lib / mysql é datadir
  • Crie table1 como tabela MyISAM no banco de dados mydb
  • Criar table2 como links simbólicos puros para table1

PASSO 01) Criar tabela1

CREATE TABLE mydb.table1
(
    id int not null auto_increment,
    mydata varchar(255) not null,
    primary key (id)
) ENGINE=MyISAM;

PASSO 02) Crie três links simbólicos para imitar o TableB

cd /var/lib/mysql/mydb
ln -s table1.frm table2.frm
ln -s table1.MYD table2.MYD
ln -s table1.MYI table2.MYI

PASSO 03) Tente inserir na tabela1 e ler a partir da tabela2. Então tente o contrário.

INSERT INTO table1 (mydata) VALUES ('rolando'),('edwards');
SELECT * FROM table2;
INSERT INTO table2 (mydata) VALUES ('abraham'),('lincoln');
SELECT * FROM table1;

Se tudo se comportar normalmente, é assim que você pode fazer isso.

EMBARGO

  1. Existe apenas uma tabela, tabela1
  2. Se você faz algum DDL
    • Execute o DDL na tabela1
    • Você deve recriar os links simbólicos da tabela2 após DDL contra a tabela1
RolandoMySQLDBA
fonte