İlişki Grafiği
GoArchive, tanımlanan tablo ilişkilerini nasıl bir kopyalama sırasına, silme sırasına ve birbirine ait satır kümesine dönüştürür.
GoArchive’in yaptığı her şey, tablolar arasında tanımladığınız ilişkilerle başlar.
İlişkileri tanımlamak
Bir iş, tek bir kök tablo ve istediğiniz sayıda ilişki tanımlar. Her ilişki şunu söyler: bu tablonun satırları şu üst kayda aittir ve şu sütun üzerinden bağlanır.
jobs:
archive_old_orders:
root_table: orders
primary_key: id
where: "created_at < DATE_SUB(NOW(), INTERVAL 2 YEAR)"
relations:
- table: order_items
primary_key: id
foreign_key: order_id
dependency_type: "1-N"
- table: shipments
primary_key: id
foreign_key: order_id
dependency_type: "1-1"
relations:
- table: shipment_items
primary_key: id
foreign_key: shipment_id
dependency_type: "1-N"
İlişkiler iç içe geçebilir. shipment_items, shipments tablosuna aittir; o da
orders tablosuna. Bu iç içelik verinizin gerçek yapısını yansıtır.
İlişkilerden sıraya
GoArchive bu tanımlardan bir grafik kurar ve topolojik olarak sıralar. Ortaya biri diğerinin tersi olan iki sıra çıkar:
orders
├── order_items
├── order_payments
└── shipments
└── shipment_items
Kopyalama sırası: orders → order_items → order_payments → shipments → shipment_items
Silme sırası: shipment_items → shipments → order_payments → order_items → orders
Önce üst kayıtlar yazılır; böylece bir alt kayıt, referans verdiği satırdan önce hedefe ulaşmaz. Önce alt kayıtlar silinir; böylece bir üst kayıt, ona işaret eden bir şey dururken silinmez.
Her iki sırayı da görebilirsiniz:
goarchive plan -c archiver.yaml --job archive_old_orders
Birbirine ait satırları bulmak
Sıra, GoArchive’e hangi tabloyu ne zaman işleyeceğini söyler. Keşif ise hangi satırları işleyeceğini söyler.
GoArchive her batch için şunu yapar:
- İşin
wherekoşuluna uyan bir kök satır kümesi seçer. - Tanımlanan ilişkileri bu satırlardan dışa doğru, kademe kademe izler; önce alt kayıtları, sonra onların alt kayıtlarını toplar.
- Sonuçta o kök satır kümesine ait bütün satırlar elde edilir.
Kopyalanan, doğrulanan ve silinen küme budur.
Tanım neden veritabanıyla örtüşmeli
Yapılandırmanızdaki ilişkiler, veritabanının foreign key’lerle zaten uyguladığı yapıyı tarif eder. GoArchive başlamadan önce ikisinin örtüştüğünü denetler, çünkü bir uyuşmazlık yanlış sıra üretir.
Veritabanına göre alt kayıt olan bir tablo yapılandırmada kardeş olarak tanımlanmışsa, silme sırası yanlış olur ve veritabanı bunu reddeder. Baştan denetlemek, bu durumu veri taşınmadan önce anlaşılır bir mesaja dönüştürür.
Denetim dışarıya da bakar: işinizin dışındaki bir tablo, işinizin içine referans veriyorsa GoArchive bunu bildirir; çünkü referans verilen satırların silinmesi, işin hesaba katmadığı veriyi etkiler.
Gereksinimler
Keşfin ve silmenin tam isabetli olması için, katılan her tablonun tek sütunlu bir primary key‘i olmalı ve bu sütun tablonun gerçek primary key’i olmalıdır. Kök tablonun anahtarı ayrıca tam sayı olmalıdır, çünkü ilerleme o anahtar üzerindeki bir konum olarak izlenir.
Alt tablolar tek sütunlu her anahtar türünü kullanabilir.
