อะไรจะเป็นคำอธิบายสำหรับการสังเกตนี้?
การซ้ำที่อยู่ผู้ใช้ในคำสั่งซื้อทุกฉบับอาจทำให้เกิดบันทึกที่ขัดแย้งกันเมื่อที่อยู่มีการเปลี่ยนแปลง
เริ่มต้นด้วยการทำนาย ระบุปริมาณหรือลักษณะที่คุณจะเปรียบเทียบ แล้วตัดสินใจว่าหลักฐานอะไรที่จะแยกแยะคำอธิบายสองแบบได้
สร้างโมเดล
ตารางฐานข้อมูลเชิงสัมพันธ์ประกอบด้วยแถวและคุณสมบัติ คีย์หลัก ใช้ระบุแถว; คีย์ภายนอก เชื่อมโยงไปยังคีย์อ้างอิงในตารางอื่น การทำให้เป็นมาตรฐานสามารถลดการซ้ำซ้อนที่ไม่จำเป็นและความผิดปกติในการอัปเดตได้ขณะคงความสัมพันธ์ที่มีนัยสำคัญไว้
คีย์หลัก (primary key): เซตของแอททริบิวต์ที่ใช้ระบุแถวในตารางได้อย่างเดียว; คีย์อ้างอิง (foreign key): เซตของแอททริบิวต์ที่อ้างอิงถึงคีย์ในตารางอื่น
เลือกหลักฐานที่นำมาทดสอบได้
การรวม (join) รวมแถวตามเงื่อนไขที่กำหนด จำนวนผลลัพธ์ขึ้นอยู่กับความเข้มแข็งของความสัมพันธ์และตัวกรอง ข้อจำกัดคีย์ภายนอกบังคับกฎความสัมพันธ์แต่ไม่ทำการเข้ารหัสข้อมูลส่วนบุคคลโดยอัตโนมัติ
ออกแบบชุดข้อมูลคำสั่งซื้อผู้ใช้อ้างอิงขนาดเล็กที่ไม่มีข้อมูลส่วนบุคคลจริง Declare คีย์ ทดสอบการแทรกซ้ำและการอ้างอิงที่หายไป จากนั้นตรวจสอบผลลัพธ์การ query กับตารางเป้าหมายที่คำนวณด้วยมือ
เริ่มจากปริมาณที่ทราบแล้ว
ระบุค่าที่ทราบและหน่วยของมัน เลือกความสัมพันธ์โดยพิจารณาว่าข้อสมมติฐานสอดคล้องกับเคสนี้ แล้วจัดรูปสมการก่อนแทนค่า
ข้อมูล: ลูกค้าสี่รายมีคำสั่งซื้อ分別是 2, 0, 3 และ 1 คำสั่ง An inner join ของลูกค้าไปยังคำสั่งคืน 2+0+3+1 = 6แถว A left join ยังคงลูกค้าที่ไม่มีคำสั่งไว้เป็นแถว null-matched หนึ่งแถว ทำให้ได้ 7在这里
ตัวอย่าง:
ลูกค้าสามรายมีคำสั่งซื้อจำนวน 1, 3 และ 2 การรวมภายใน (inner join) ระหว่างลูกค้ากับคำสั่งจะคืนกี่แถว? ใช้ลำดับขั้นตอนเดียวกัน: ข้อมูลที่ทราบ → แบบจำลอง →ความสัมพันธ์ → แทนค่า → หน่วยและการตีความ
ตรวจสอบข้อสรุปและขอบเขต
คีย์หลักไม่จำเป็นต้องเป็นชื่อบุคคล การรวม (join) ไม่ใช่การต่อกันของตารางอย่างง่าย ควรใช้ query ที่มีพารามิเตอร์สำหรับข้อมูลที่ไม่ไว้วางใจแทนการสร้าง SQL จากสตริงดิบ
กลับไปที่การสังเกตเดิม อธิบายว่าผลลัพธ์นี้สนับสนุนสิ่งใด มีเงื่อนไขใดบ้าง และเป็นอย่างไรในการทดสอบคำอธิบายอื่นที่ขัดแย้งกัน
เตือน:
คีย์ภายนอกจะทำการเข้ารหัสทุกแถวโดยอัตโนมัติ ข้ออ้างนี้ผิด: คีย์หลักไม่จำเป็นต้องเป็นชื่อบุคคล การรวม (join) ไม่ใช่การต่อกันของตารางอย่างง่าย ควรใช้ query ที่มีพารามิเตอร์สำหรับข้อมูลที่ไม่ไว้วางใจแทนการสร้าง SQL จากสตริงดิบ
จุดสำคัญ:
ฐานข้อมูลเชิงสัมพันธ์: คีย์และความสัมพันธ์: การรวม (join) รวมแถวตามเงื่อนไขที่กำหนด จำนวนผลลัพธ์ขึ้นอยู่กับความเข้มแข็งของความสัมพันธ์และตัวกรอง ข้อจำกัดคีย์ภายนอกบังคับกฎความสัมพันธ์แต่ไม่ทำการเข้ารหัสข้อมูลส่วนบุคคลโดยอัตโนมัติ
ลายเส้นที่ดำเนินการได้และขอบเขต
import sqlite3
db = sqlite3.connect(":memory:")
db.executescript("""CREATE TABLE c(id INTEGER PRIMARY KEY);
CREATE TABLE o(id INTEGER PRIMARY KEY, cid INTEGER);
INSERT INTO c VALUES(1),(2),(3);
INSERT INTO o VALUES(10,1),(11,1),(12,3);""")
for kind in ["INNER", "LEFT"]:
sql = f"SELECT COUNT(*),COUNT(o.id) FROM c {kind} JOIN o ON c.id=o.cid"
print(kind, db.execute(sql).fetchone())
db.close()
ผลลัพธ์ที่คาดหวัง:
INNER (3, 3)
LEFT (4, 3)
Left join รักษาลูกค้า 2 กับช่องคำสั่งซื้อเป็น null COUNT(*) รวมแถวนั้น ในขณะที่ COUNT(o.id) ขาดแถวนั้น คีย์หลักแยกแยะบันทึก; จำนวนลูกค้าไม่ใช่จำนวนคำสั่งซื้อ คำเชื่อมที่แทรกเข้ามามาจากรายการภายในคงที่ ไม่ใช่ข้อมูลผู้ใช้