ฉันสามารถมีตารางหนึ่งเป็น "นามแฝง" หรือ "symlink" ไปยังตารางอื่นได้หรือไม่


10

ฉันมีสองตารางที่มีโครงสร้างเดียวกัน A และ B มีการเขียนแอปพลิเคชันบางอย่างเพื่อให้มันเขียนข้อมูลเดียวกันไปยังตารางทั้งสองเสมอ

หลังจากการสนทนากับเพื่อนร่วมงานเกี่ยวกับศักยภาพในการประหยัดพื้นที่ไดรฟ์ฉันสงสัยว่า mysql หรือ postgresql มีความสามารถในการสร้างบนโต๊ะเป็น "นามแฝง" หรือ "symlink" ของอีกคน

ฉันต้องการให้พฤติกรรมคล้ายกับ symlink ของไฟล์อ่อน โดยที่การอ่านจาก symlink เองหรือเป้าหมายจะให้ผลลัพธ์เดียวกันและการเขียนไปที่ทั้งสองจะเป็นการอัพเดตเป้าหมาย


2
คุณถือว่ามุมมองของตารางหรือไม่?

ใน SQL Server คุณสามารถใช้มุมมอง
JNK

1
RDBMS ใด คุณติดแท็ก MySQL และ Postgres มุมมองจะทำงานใน RDBMS ส่วนใหญ่ Oracle มีคำพ้องความหมายซึ่งเหมือนกับลิงก์สัญลักษณ์ของ Unix
Philᵀᴹ

MySQL และ Postgres ใช่ ฉันพูดถึงพวกเขาโดยเฉพาะในข้อความเช่นกัน ฉันคิดว่า Views ไม่ได้เป็นอย่างที่ฉันต้องการ แต่บางทีมันก็ใช้ได้ ขอบคุณมาก. โพสต์คำตอบบางข้อ :)
user50849

1
และทำไมคุณต้องมีสองโต๊ะ
miracle173

คำตอบ:


5

เท่าที่ฉันรู้ Postgresql ใหม่จะช่วยให้คุณมีINSTEAD OFมุมมอง ดังนั้นการมีหนึ่งตารางหนึ่งมุมมองSELECT * FROM table1และINSTEAD OFทริกเกอร์insert, update, deleteควรทำงานเพื่อคุณ วิธีนี้ไม่สามารถใช้กับ Mysql ได้


2

มันเป็นไปได้ใน MySQL (ใช้ MyISAM หน่วยเก็บข้อมูลเท่านั้น) เพื่อสร้างตารางตั้งแต่เริ่มต้นโดยใช้ symlink มันเป็นไปได้ใน Linux และ Windows (ใช้ hardlinks):

นี่คือโพสต์ที่ผ่านมาของฉันในเรื่องนี้

อย่างไรก็ตามสิ่งที่คุณเสนอจะต้องทำนอก MySQL ใน Linux

สำหรับตัวอย่างนี้

  • / var / lib / mysql เป็นวันที่
  • สร้าง table1 เป็นตาราง MyISAM ในฐานข้อมูล mydb
  • สร้าง table2 เป็น symlink แท้ๆไปที่ table1

STEP 01) สร้าง table1

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

ขั้นตอนที่ 02) สร้าง symlink สามตัวเพื่อเลียนแบบ TableB

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

ขั้นตอนที่ 03) ลองแทรกลงใน table1 และอ่านจาก table2 จากนั้นลองสลับด้าน

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

หากทุกอย่างทำงานปกตินี่คือวิธีที่คุณทำได้

ข้อแม้

  1. มีเพียงหนึ่งตารางคือ table1
  2. ถ้าคุณทำ DDL ใด ๆ
    • ดำเนินการ DDL บนตารางที่ 1
    • คุณต้องสร้าง symlink table2 ใหม่หลังจาก DDL เทียบกับ table1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.