Doküman menüsü

Sürüm 1.8.0-community

İ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:

  1. İşin where koşuluna uyan bir kök satır kümesi seçer.
  2. 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.
  3. 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.