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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Author join
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- Evet. Foreign key yalnız join için bir açıklamadır.
- 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}
- Bir book birden fazla tag ile eşleşebilir.
- 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