Czy jedna tabela może być „aliasem” lub „dowiązaniem symbolicznym” do drugiej?

10

Mam dwie tabele o tej samej strukturze, A i B. Pewna aplikacja jest zapisywana, aby zawsze zapisywała te same dane w obu tabelach.

Po dyskusji z kolegą na temat możliwości zaoszczędzenia miejsca na dysku zastanawiam się, czy mysql lub postgresql może tworzyć na stole jako „alias” lub „dowiązanie symboliczne” innego.

Chcę, aby zachowanie było bardzo podobne do zachowania dowiązania symbolicznego do pliku miękkiego; gdzie odczyt z samego dowiązania symbolicznego lub jego celu da ten sam wynik, a zapis do jednego z nich zaktualizuje cel.

użytkownik50849
źródło
2
Czy zastanawiałeś się nad widokiem stołu?
W SQL Server możesz po prostu użyć widoku.
JNK
1
Który RDBMS? Oznaczono tagami MySQL i Postgres. Widoki będą działać w większości RDBMS. Oracle ma synonimy, które są takie same jak dowiązania symboliczne z Uniksa
Philᵀᴹ
MySQL i Postgres, tak. Wspominam o nich również w tekście. Myślałem, że widoki nie były tym, czego szukałem, ale być może będzie dobrze. Wielkie dzięki. Opublikuj odpowiedzi :)
user50849
1
i dlaczego potrzebujesz dwóch stolików?
cud 173

Odpowiedzi:

5

O ile mi wiadomo, nowy Postgresql umożliwia INSTEAD OFuruchamianie widoków. Tak więc posiadanie jednego stołu, jednego widoku jako SELECT * FROM table1i INSTEAD OFwyzwalacza insert, update, deletepowinno działać dla Ciebie. Takie podejście nie zadziała jednak w MySQL

a1ex07
źródło
2

W MySQL (tylko przy użyciu silnika pamięci MyISAM) możliwe jest tworzenie tabeli od zera za pomocą dowiązań symbolicznych. Jest to możliwe w Linuksie i Windowsie (przy użyciu twardych linków):

Oto moje poprzednie posty na ten temat

Jednak to, co proponujesz, musiałoby być zrobione poza MySQL w Linuksie.

Dla tego przykładu

  • / var / lib / mysql jest datadir
  • Utwórz table1 jako tabelę MyISAM w bazie danych mydb
  • Utwórz table2 jako czyste dowiązania symboliczne do table1

KROK 01) Utwórz tabelę 1

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

KROK 02) Utwórz trzy dowiązania symboliczne, aby naśladować Tabela B

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

KROK 03) Spróbuj wstawić do tabeli 1 i czytać z tabeli 2. Następnie spróbuj odwrotnie.

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

Jeśli wszystko zachowuje się normalnie, możesz to zrobić w ten sposób.

CAVEAT

  1. Jest tylko jedna tabela, tabela 1
  2. Jeśli wykonasz dowolny DDL
    • Wykonaj DDL na table1
    • Należy odtworzyć dowiązania symboliczne table2 po DDL względem table1
RolandoMySQLDBA
źródło