Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-18.01

Relational data ve relationships

Application state’i tables, rows, keys ve ilişkilerle modelle. Public books örneğinde join sonucu ile referential constraint’in ayrı işler yaptığını izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Author join

  1. Catalog hazır

    Örneğin public catalog’u relational schema ve connection FK=1 ile hazırdır; query sonucu henüz üretilmemiştir.

    Application
    Query yok
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  2. Operation seçimi

    Application, books.author_id ile authors.id eşleşmesini okuyup b.id ile sıralayan sabit SELECT’i seçer. Bu author join statement’ında placeholder veya bound parameter yoktur; tablo ve column adları uygulama kodunda sabittir.

    Application
    Join requested
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  3. Driver binding

    Driver, sabit author join statement’ını aynı process içindeki SQLite connection’a verir. FK=1 bu connection’ın ayrı configuration’ıdır; SELECT’in çalışması write constraint testi değildir.

    Application
    Join requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  4. Relational karar

    SELECT, books kayıtlarındaki author_id=1 değerlerini authors.id=1 ile eşleştirir. Tea book ve Coffee book için Duru adı bulunur; ORDER BY b.id sonucu 10, ardından 11 sırasına koyar.

    Application
    Join requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    Joined by author_id
    Query result
    Sonuç yok
  5. Result shape

    Cursor result’i Tea book/Duru ve Coffee book/Duru olmak üzere iki ordered row içerir. Bu adlandırılmış read sonucu, author identity’si veya application resource permission değildir.

    Application
    Join requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    Joined by author_id
    Query result
    Tea/Duru; Coffee/Duru
  6. Application sonucu

    Application result’i kullanır; in-memory connection’ın bu state’i kalıcı disk catalog garantisi değildir.

    Application
    Public result hazır
    SQLite driver
    Yerel operation bitti; result döndü
    Relational tables
    Joined by author_id
    Query result
    Tea/Duru; Coffee/Duru

Missing parent

  1. Catalog hazır

    Örneğin public catalog’u relational schema ve connection FK=1 ile hazırdır; query sonucu henüz üretilmemiştir.

    Application
    Query yok
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  2. Operation seçimi

    Application, yeni book row’u için author_id=99 candidate değerini seçer. authors kaydında yalnız id=1 vardır; insert kararı connection’ın immediate foreign-key koşuluna bağlıdır.

    Application
    Orphan row candidate
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  3. Driver binding

    Driver, insert operation’ı ile author_id=99 data’sını SQLite connection’a yerel olarak verir. Henüz row eklenmemiştir; FK=1 ve NOT NULL child key koşulları insert sırasında uygulanır.

    Application
    Orphan row candidate
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  4. Relational karar

    authors.id=99 bulunmadığından immediate FOREIGN KEY constraint insert’i reddeder. books row count önceki 2 değerinde kalır; author join çalışmış olması bu ret kararının nedeni değildir.

    Application
    Orphan row candidate
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    Parent 99 yok; reddedildi
    Query result
    Sonuç yok
  5. Result shape

    Driver sonucu IntegrityError ve books=2 durumunu taşır. Candidate saklanmamıştır; bu result, sonraki yerel adımda application tarafından tüketilir ve actor’ın kimliği veya niyeti hakkında karar vermez.

    Application
    Orphan row candidate
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    Parent 99 yok; reddedildi
    Query result
    IntegrityError; books=2
  6. Application sonucu

    Application result’i kullanır; in-memory connection’ın bu state’i kalıcı disk catalog garantisi değildir.

    Application
    Candidate saklanmadı
    SQLite driver
    Yerel operation bitti; result döndü
    Relational tables
    Parent 99 yok; reddedildi
    Query result
    IntegrityError; books=2

Book tags

  1. Catalog hazır

    Örneğin public catalog’u relational schema ve connection FK=1 ile hazırdır; query sonucu henüz üretilmemiştir.

    Application
    Query yok
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  2. Operation seçimi

    Application, books/tag ilişkisindeki üç book_tags pair’ini okumayı seçer: [10,1], [10,2], [11,1]. Tea book için iki farklı tag vardır; bu operation yeni book veya pair eklemez.

    Application
    Tags query requested
    SQLite driver
    Connection FK=1
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  3. Driver binding

    Driver, sabit association read’ini aynı process’teki SQLite connection’a verir. Table/column seçimi data’dan çıkarılmaz; tag relationship’leri yalnız okunur, write mutation yapılmaz.

    Application
    Tags query requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    2 books; 3 links
    Query result
    Sonuç yok
  4. Relational karar

    Books ve tags, book_tags içindeki book_id/tag_id pair’leriyle eşleşir. Toplam üç association vardır; book_id=10 iki farklı tag’e eşleştiği için bir book iki result row üretebilir.

    Application
    Tags query requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    3 association row join edildi
    Query result
    Sonuç yok
  5. Result shape

    Tea book için tag sonucu web ve notes’tur; farklı book sayısı 2, association sayısı 3 kalır. Composite key aynı book/tag pair’inin tekrarını sınırlar, book_id=10’un iki tag’ini yasaklamaz.

    Application
    Tags query requested
    SQLite driver
    Yerel SQLite operation işleniyor
    Relational tables
    3 association row join edildi
    Query result
    Tea: web + notes
  6. Application sonucu

    Application result’i kullanır; in-memory connection’ın bu state’i kalıcı disk catalog garantisi değildir.

    Application
    Tea tags: web + notes; 2 book / 3 pair
    SQLite driver
    Yerel operation bitti; result döndü
    Relational tables
    3 association row join edildi
    Query result
    Tea: web + notes

ROLLER · STATE · VERİ AKIŞI

Database neden browser state’inden ayrıdır?

Web application birden çok request ve kullanıcı arasında paylaşılacak structured state’e ihtiyaç duyabilir: public book catalog, author bilgisi veya note’un son kaydı gibi. Database data’yı saklayan, sorgulayan ve tutarlılık sınırlarını uygulayan bileşendir. Browser preference cookie’si veya tek process variable’ı aynı ownership’i sağlamaz. Database kullanmak da storage’ı otomatik durable yapmaz; bu dersin SQLite relational örneği :memory: connection içinde yaşar ve disk durability garantisi taşımaz.

Relational model’de table adlandırılmış structure, column attribute, row ise kayıttır. Authors table’ındaki id/name ile books table’ındaki id/title/author_id farklı anlamlar taşır. Primary key row kimliğini unique tanımlar; name ve title kendiliğinden unique olmaz. Örnek aynı author’ın Tea book ve Coffee book kayıtlarını ayrı book ID’leriyle tutar. Query sonucunun sırası önemliyse ORDER BY açıkça seçilir; table görünür sırayla tutulmuş bir liste sayılmaz.

Schema’nın column/type/constraint tanımları data contract’ını belirler. SQLite column affinity ile çalışabilir; bütün relational engine’lerin type enforcement davranışını aynı sayma. Burada authors.id ve books.id INTEGER PRIMARY KEY, name/title ve author_id NOT NULL’dır. ID application authorization kararı değildir. Query’nin bir row bulması veya key’in integer olması onun herhangi bir kullanıcıya sunulabileceğini söylemez; örnek public synthetic catalog içindir.

Key ilişkiyi sınırlar; join sonucu üretir

books.author_id FOREIGN KEY authors.id’ye referans verir. Parent author’ın birden çok book’a karşılık gelmesi one-to-many ilişkiyi gösterir; her book’ın NOT NULL author_id’si bu fixture’de bir parent’a bağlıdır. Foreign key mevcut parent key’i şart koşar; parent’ın bütün attributes’ını book row’una kopyalamaz. Join books ve authors eşleşmesini kullanıp book title ile author name’i aynı result row’unda üretir. Constraint ile query iki farklı mekanizmadır.

SQLite foreign-key enforcement ilgili connection’da PRAGMA foreign_keys=ON ile etkinleştirilir; değerin 1 olduğu ayrıca gözlenir. CREATE TABLE içinde declaration görmek enforcement’ın açık olduğunu kanıtlamaz. Örnek immediate constraint kullanır: author_id=99 için parent olmadığından insert reddedilir ve books row count değişmez. NOT NULL olmasaydı NULL child key başka anlam taşıyabilirdi; bütün foreign key’ler için zorunlu ilişki varsayılmaz.

Many-to-many için books ve tags arasına book_tags association table’ı konur; book_id/tag_id birlikte composite primary key oluşturur. Tea book iki tag’e, shared tag iki book’a bağlı olabilir. Bu fixture üç association row’uyla dört tabloyu birleştirir; duplicate association pair’i UNIQUE/PK constraint reddeder. Relationship cardinality yalnız column isminden çıkmaz; unique/nullability ve association structure birlikte okunur. Silme/update policy’si de ayrıca belirlenir; burada cascade davranışı varsayılmaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

FK enforcement

  1. İlişki declaration’ı okundu

    books.author_id, authors(id) için FOREIGN KEY olarak tanımlıdır ve NOT NULL’dır. Declaration, connection’da kontrolün etkin olduğuna tek başına kanıt değildir.

    Schema ve catalog
    author_id → authors.id
    Relation gate
    Enforcement pending
    Application mapping
    Row count=2
  2. Connection koşulu eşleştirildi

    enforcement foreignKeysEnabled=1 ve immediate constraint timing bildirir. Bu koşullar seçilen connection’a aittir, bütün SQLite connection’larına genellenmez.

    Schema ve catalog
    foreignKeysEnabled=1
    Relation gate
    Immediate constraint
    Application mapping
    Row count=2
  3. Parent reference sonucu okundu

    orphanAuthorId=99 için parent record yoktur ve orphanAttemptAccepted=false’tur. Bu harmless catalog row’unda referential integrity gate’i kabul vermez.

    Schema ve catalog
    Parent 99 absent
    Relation gate
    Insert accepted=false
    Application mapping
    Final count pending
  4. Negatif mutation sınırı doğrulandı

    rowCountBefore=2 ve rowCountAfter=2 aynı kalır. Ret ile final state birlikte okunur; yalnız constraint adı görmek no-write sonucunu tamamlamaz.

    Schema ve catalog
    Known FK rejection
    Relation gate
    Before=2; after=2
    Application mapping
    No new book row
  5. JOIN integrity kontrolü sayılmadı

    Normal JOIN iki title/name row’u üretir. SELECT sonucunun doğru görünmesi write sırasında FK’nin uygulandığı kanıtı değildir; ayrı enforcement kaydı gerekir.

    Schema ve catalog
    Query result separate
    Relation gate
    Write constraint separate
    Application mapping
    No implied enforcement
  6. Referential integrity permission olmadı

    Author id=1 katalog ilişki anahtarıdır, authenticated subject değildir. Parent’ın bulunması bir actor’a books okuma veya değiştirme izni vermez.

    Schema ve catalog
    Data relation known
    Relation gate
    Identity separate
    Application mapping
    No permission grant

Join cardinality

  1. Association table incelendi

    book_tags üç pair içerir: [10,1], [10,2] ve [11,1]. Composite primary key book_id/tag_id pair’ini unique tutar, book_id’yi tek başına unique yapmaz.

    Schema ve catalog
    Association rows=3
    Relation gate
    Distinct books=2
    Application mapping
    Mapping pending
  2. Tea book’ın iki tag’i ayrıldı

    Tea book için web ve notes tag’leri vardır. Raw join iki association gösterebilir; bu iki bağımsız book veya duplicate primary key değildir.

    Schema ve catalog
    Tea tags: web, notes
    Relation gate
    One book, two associations
    Application mapping
    Aggregate pending
  3. Count’un hangi şeyi saydığı belirlendi

    associationRows=3 ile distinctBooks=2 farklı soruları cevaplar. Application association sayısını book toplamı diye kullanırsa doğru data’dan yanlış aggregate üretir.

    Schema ve catalog
    Pairs=3
    Relation gate
    Books=2
    Application mapping
    Counting unit explicit
  4. Duplicate pair sonucu ayrı okundu

    duplicatePairAccepted=false composite uniqueness sınırıdır. Aynı book’ın farklı tag’lerle iki row’da bulunması bu negatif duplicate pair koşulunu sağlamaz.

    Schema ve catalog
    Duplicate pair=false
    Relation gate
    Different tags allowed
    Application mapping
    No false duplicate finding
  5. Presentation identity korundu

    Book view book_id üzerinden group edilebilir, tag’ler ayrı collection kalır. Bu mapping kararı authentication veya authorization identity’si değildir.

    Schema ve catalog
    Group by book identity
    Relation gate
    Tags remain associations
    Application mapping
    Access policy separate
  6. Sorgu sonucu sınırlı yorumlandı

    Cardinality tablosu yalnız verilen iki book ve üç pair için kanıttır. ORM identity map, concurrency veya farklı schema’nın davranışı bu sonuçtan çıkarılmaz.

    Schema ve catalog
    Selected cardinality known
    Relation gate
    Other mappings unobserved
    Application mapping
    No extra object inference

VARSAYIM · SINIR · KONTROL

Schema declaration ile enforcement aynı kanıt değildir

Relational ilişkiyi incelerken CREATE TABLE içinde FOREIGN KEY görmekle yetinme. İlgili SQLite connection’da foreign_keys değeri ve beklenen constraint sonucu birlikte gerekir. Parent bulunmayan catalog row’unun reddi o connection’ın referential-integrity sınırını gösterir; başka connection veya schema için aynı davranışın kanıtı değildir. Application comment’i ile uygulanan constraint birbirinin yerine geçmez.

JOIN’in title/name result’i üretmesi, ilişkiyi yazarken koruyan constraint’in bulunduğunu kanıtlamaz. Query ve integrity farklı işlerdir. Row count, parent reference ve beklenen rejection birlikte okunduğunda hangi işlemin data’yı değiştirmediği anlaşılır. Bir query’nin çalışmasıyla insert koşulunun enforcement’ı ayrı tutulur; biri diğerinin yerini almaz.

Result multiplicity ve identity sınırı

Many-to-many join tek logical book için birden fazla result row üretebilir. Tea book’ın iki tag’i varsa iki row normaldir; application bunu duplicate book veya iki independent object sanmamalıdır. Olası etki yanlış aggregate veya kullanıcıya aynı record’un tekrar gösterilmesidir. Kontrol, result shape ve association cardinality’sini presentation mapping’e bağlamaktır.

Primary key data identity’sini anlatır; authenticated subject veya object permission’ı değildir. Public catalog örneğinde bu ayrım kolay görünür: author id=1 bir login identity değildir. Relationship’ten erişim hakkı çıkarılmamalıdır. Native in-memory test join/constraint sonucunu gözler; disk persistence, isolation altında concurrent reader, ORM identity map veya production permission politikasını burada doğrulamaz.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Relation tuple

  1. Parent ve child kayıtları bağlandı

    authors=[1,Duru] ve books içindeki iki row author_id=1 taşır. İnceleme parent key ile child reference’ı aynı schema context’inde okur.

    Schema/query observation
    Author: 1 / Duru
    Connection evidence review
    Books: 10, 11
    Evidence conclusion
    Join review pending
  2. JOIN predicate ve order incelendi

    join.sql a.id=b.author_id koşuluyla eşleştirir ve b.id ile sıralar. Result order bu açık ORDER BY’dan gelir; table’ın fiziksel sırası varsayılmaz.

    Schema/query observation
    Predicate: author reference
    Connection evidence review
    Order: b.id
    Evidence conclusion
    Two matched rows
  3. Beklenen result row’ları eşleştirildi

    Tea book/Duru ve Coffee book/Duru sonuçları ilişki okumasını gösterir. Bu row’lar foreign key enforcement alanlarının yerine kullanılmaz.

    Schema/query observation
    Tea book / Duru
    Connection evidence review
    Coffee book / Duru
    Evidence conclusion
    Read result known
  4. Schema enforcement tuple’ı eklendi

    Foreign key declaration, pragma değeri, orphan rejection ve final row count birlikte gerekir. Bu tuple ile query sonucu farklı kanıtların ilişkisidir.

    Schema/query observation
    Declaration + pragma
    Connection evidence review
    Rejection + row count
    Evidence conclusion
    Evidence fields linked
  5. Memory lifetime açık tutuldu

    databaseLifetime=:memory: connection only’dır. Connection kapanınca bu ephemeral katalogun disk üzerinde kalıcı olduğuna dair sonuç verilmez.

    Schema/query observation
    Connection-owned data
    Connection evidence review
    Disk persistence unobserved
    Evidence conclusion
    Lifetime bounded
  6. Review sonucu operation’a bağlandı

    Bilinen JOIN ve constraint sonuçları seçilen schema/connection’a bağlıdır. Daha fazla index veya row eklemek bunları resource permission kanıtına dönüştürmez.

    Schema/query observation
    Selected read/constraint known
    Connection evidence review
    Permission not established
    Evidence conclusion
    No broader database claim

Observation eksik

  1. Relation selector koşulu okundu

    Selector parentExists=false ve insertAccepted=true olan relation observation’larını sayar. Bu authored alanlar product database log field’ları olarak varsayılmaz.

    Schema/query observation
    Parent absent + insert accepted
    Connection evidence review
    Selector review pending
    Evidence conclusion
    Evidence scope bounded
  2. Normal negatif observation incelendi

    Normal XML parentExists=false ve insertAccepted=false içerir; expected=0’dır. Sıfır, bu kayıt içindeki violation koşulunun eşleşmediğini gösterir.

    Schema/query observation
    Normal expected=0
    Connection evidence review
    Rejected insert observed
    Evidence conclusion
    No matched violation
  3. Pozitif comparison fixture’ı ayrıldı

    positiveFixtureXml parentExists=false ve insertAccepted=true içerir, positiveExpected=1’dir. Bu karşılaştırma selector’ın koşulunu sınar; gerçek kabul edilmiş insert kaydı değildir.

    Schema/query observation
    Comparison expected=1
    Connection evidence review
    Inconsistent fixture only
    Evidence conclusion
    No incident inference
  4. Benign cardinality false positive olmadı

    Tea book’ın iki tag association’ı parent yokluğu değildir. Birden çok JOIN row’u bu selector’ın iki koşulundan hiçbirini tek başına karşılamaz.

    Schema/query observation
    Two tags benign
    Connection evidence review
    Relation condition distinct
    Evidence conclusion
    No cardinality alarm
  5. Missing observation bilinmez kaldı

    Event veya gerekli alan bulunmazsa count=0 temiz enforcement sonucu değildir. Aynı connection için rejection ve state sonucu olmadan karar incomplete kalır.

    Schema/query observation
    Coverage may be missing
    Connection evidence review
    Enforcement UNKNOWN
    Evidence conclusion
    No clean conclusion
  6. Ek kanıt gereksinimi yazıldı

    Schema, connection pragma, attempted relation ve final row count için gözlem gerekir. Selector eşleşme sayısı bu bağların bulunmasının yerine geçmez.

    Schema/query observation
    Connection evidence required
    Connection evidence review
    Final state required
    Evidence conclusion
    Observation gap retained

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Schema ve result ledger’ini bağla

Artifact author kaydını [1,Duru], books kayıtlarını [10,Tea book,1] ve [11,Coffee book,1] olarak gösterir. ORDER BY books.id join sonucundaki iki title/name row’unu sıralar. Book_tags üç unique pair içerir; Tea book iki tag’e bağlı olduğundan grouped book count ile raw join count farklı soruları yanıtlar. Table ve field’ler örneğin sentetik schema’sına aittir; gerçek product veya kullanıcı verisi değildir.

Enforcement kaydında foreignKeysEnabled=1, orphanAttemptAccepted=false ve rowCountBefore=rowCountAfter=2 görülür. Duplicate association da accepted=false verir. IntegrityError burada SQLite constraint sonucudur; bütün relational ürünlerde aynı exception API’si beklenmez. Nullability, parent key uniqueness ve constraint timing birlikte incelenir; yalnız column adına bakarak relationship kararı verilmez.

İlişki selector’ını tek connection’a bağla

XPath count(/audit/relation[@parentExists="false" and @insertAccepted="true"]) parent olmadan insert kabul edildiğini belirten kayıtları sayar. Normal foreign-key rejection sonucu 0, tutarsız kabul içeren kontrol kaydı 1 verir. Bir book’ın birden çok tag’e bağlanması bu ihlal değildir; beklenen cardinality’dir. Event eksikken count=0 çıkması enforcement kanıtı olmaz, kanıt boşluğu olarak kalır.

Düzeltme sonrası schema declaration, connection pragma ve final row result’i aynı bounded fixture üzerinden ilişkilendir. Daha çok row veya index eklemek bu integrity kararını kendiliğinden authorization’a çevirmez. Database’in neden kullanıldığını, hangi owner’ın hangi state’i sakladığını ve örneğin :memory: yaşam süresini açık tut. Connection kapandığında bu ephemeral data’nın kalıcı katalog sayılmaması storage lifecycle’ın parçasıdır.

Foreign key declaration tek başına enforcement değildir. SQLite connection açılışında PRAGMA foreign_keys durumunu transaction başlamadan ayarla ve geri oku; pool’daki her connection bu politikayı taşımalıdır. Transaction ortasında değiştirmek etkisiz olabilir. Parent key’in uygun PRIMARY KEY veya UNIQUE koşulunu, child alanlarının nullability’sini ve association pair için uniqueness’i açıkça tanımla. İş kuralı parent’ı zorunlu tutuyorsa NULL kabul eden foreign key tek başına yetmez. Normal join sonucunu, orphan ret sonrası değişmeyen row sayısını ve duplicate association ret sonucunu birlikte doğrula; pragma ya da sonuç kaydı eksikse enforcement bilinmiyordur.

ŞİMDİ VAKAYA UYGULA

JOIN sonucu hangi write veya identity koşulunu kanıtlamaz?

Public katalog iki book ve üç tag association içerir. Read sonucu, constraint enforcement ve association sayısı farklı ledger alanlarıyla değerlendirilir.

Vakadaki cached representation’ı authoritative data owner’la karşılaştır. Stored value, revision, transaction ve cache copy için aynı completion sonucunu kullanma.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Public books schema ve relationship ledger

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "schema": {
    "authors": {
      "columns": [
        "id INTEGER PRIMARY KEY",
        "name TEXT NOT NULL"
      ]
    },
    "books": {
      "columns": [
        "id INTEGER PRIMARY KEY",
        "title TEXT NOT NULL",
        "author_id INTEGER NOT NULL"
      ],
      "foreignKey": "author_id REFERENCES authors(id)"
    },
    "tags": {
      "columns": [
        "id INTEGER PRIMARY KEY",
        "label TEXT NOT NULL"
      ]
    },
    "book_tags": {
      "columns": [
        "book_id INTEGER NOT NULL",
        "tag_id INTEGER NOT NULL"
      ],
      "primaryKey": [
        "book_id",
        "tag_id"
      ],
      "foreignKeys": [
        "book_id REFERENCES books(id)",
        "tag_id REFERENCES tags(id)"
      ]
    }
  },
  "records": {
    "authors": [
      [
        1,
        "Duru"
      ]
    ],
    "books": [
      [
        10,
        "Tea book",
        1
      ],
      [
        11,
        "Coffee book",
        1
      ]
    ],
    "tags": [
      [
        1,
        "web"
      ],
      [
        2,
        "notes"
      ]
    ],
    "book_tags": [
      [
        10,
        1
      ],
      [
        10,
        2
      ],
      [
        11,
        1
      ]
    ]
  },
  "join": {
    "sql": "SELECT b.title, a.name FROM books AS b JOIN authors AS a ON a.id=b.author_id ORDER BY b.id",
    "rows": [
      [
        "Tea book",
        "Duru"
      ],
      [
        "Coffee book",
        "Duru"
      ]
    ]
  },
  "manyToMany": {
    "teaTags": [
      "web",
      "notes"
    ],
    "associationRows": 3,
    "distinctBooks": 2,
    "duplicatePairAccepted": false
  },
  "enforcement": {
    "foreignKeysEnabled": 1,
    "orphanAuthorId": 99,
    "orphanAttemptAccepted": false,
    "rowCountBefore": 2,
    "rowCountAfter": 2,
    "constraintTiming": "immediate, NOT NULL child key",
    "databaseLifetime": ":memory: connection only"
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><relation parentExists=\"false\" insertAccepted=\"false\"/></audit>",
    "xpath": "count(/audit/relation[@parentExists=\"false\" and @insertAccepted=\"true\"])",
    "expected": 0,
    "positiveFixtureXml": "<audit><relation parentExists=\"false\" insertAccepted=\"true\"/></audit>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
schema
Authored SQLite keys/nullability; gerçek product schema’sı değil.
join
Constraint’ten ayrı ordered read result’i.
enforcement
Seçilmiş connection’daki observed FK/duplicate-pair boundaries.

Sentetik books/tags kayıtları in-memory connection kullanır. Join ve constraint sonuçları identity, disk durability veya ORM runtime kanıtı değildir.

İki yanlış kanı

JOIN çalışıyorsa foreign key enforcement da kesin açıktır.

Query eşleşme üretir; constraint enforcement ayrıca schema ve SQLite connection configuration’a bağlıdır.

Primary key veya author relationship object authorization’ı verir.

Key data identity/integrity içindir; application erişim kararı ayrı bir policy’dir.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Foreign key kontrolü açık. Yeni book kaydında author_id=99 var, fakat authors tablosunda bu ID bulunmuyor. Insert kabul edilir mi?

  1. Evet. Foreign key yalnız join için bir açıklamadır.
  2. Hayır. Book sayısı 2 olarak kalır.
Gerekçeli cevabı oku

Hayır. Book sayısı 2 olarak kalır. — orphanAttemptAccepted=false; işlem öncesinde ve sonrasında book sayısı 2. Olmayan parent kaydına referans eklenmiyor.

Association tablosunda 3 satır var, fakat yalnız 2 farklı book var. Book sayısı neden 3 değil?

Dersten seçilen artifact alanları; öğretim örneği

schema.book_tags.primaryKey
["book_id","tag_id"]
records.book_tags
[[10,1],[10,2],[11,1]]
manyToMany
{"teaTags":["web","notes"],"associationRows":3,"distinctBooks":2,"duplicatePairAccepted":false}
  1. Bir book birden fazla tag ile eşleşebilir.
  2. Her association satırı yeni bir book oluşturur.
Gerekçeli cevabı oku

Bir book birden fazla tag ile eşleşebilir. — Tea iki tag ile eşleşiyor. book_tags tablosundaki book_id/tag_id composite key, aynı çiftin tekrarını engeller; yeni bir book oluşturmaz.

Duru’nun iki book kaydı authors join’iyle listeleniyor. Referential integrity neden okuma izni veya power-loss durability kanıtı değildir?

Gerekçeli cevabı oku

Foreign key, referans verilen parent kaydının varlığını; composite key ise aynı ilişkinin tekrar edilmemesini denetler. Bu constraint’ler hangi kullanıcının hangi book kaydını okuyabileceğine karar vermez. Database bu örnekte :memory: connection ömrüyle sınırlıdır. Yeniden başlatma veya güç kaybı sonrasında verinin kalması ölçülmemiştir.

□ Referential integrity ile okuma iznini ayrı açıkladım.

□ In-memory database sonucundan durability garantisi çıkarmadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • SQLite — Foreign Key Support1. Introduction to Foreign Key Constraints · 2. Enabling Foreign Key Support · 3. Required and Suggested Database Indexes · 4.1. Composite Foreign Key Constraints · 4.2. Deferred Foreign Key Constraints
  • SQLite — CREATE TABLE2. The CREATE TABLE command · 3.1. Column Data Types · 3.5. The PRIMARY KEY · 3.6. UNIQUE constraints · 3.8. NOT NULL constraints
  • Python 3.14 — sqlite3Tutorial · sqlite3.connect · Cursor.execute · How to use placeholders to bind values in SQL queries · Transaction control via the isolation_level attribute · How to use the connection context manager