ฉันจำเป็นต้องใช้ ID ในฐานข้อมูลของฉันหรือไม่หากบันทึกสามารถระบุวันที่ได้


17

ฉันกำลังเขียนแอปพลิเคชันแรกสำหรับ Android และจะใช้ฐานข้อมูล SQLite ดังนั้นจะพยายาม จำกัด ขนาดให้มากที่สุด แต่ฉันคิดว่าคำถามนี้ใช้กับการออกแบบฐานข้อมูลโดยทั่วไป

ฉันวางแผนที่จะจัดเก็บบันทึกที่จะมีข้อความและวันที่สร้าง แอพนี้เป็นแอพแบบสแตนด์อะโลนนั่นคือจะไม่เชื่อมโยงกับอินเทอร์เน็ตและมีผู้ใช้เพียงรายเดียวเท่านั้นที่จะอัปเดตดังนั้นจึงไม่มีโอกาสที่จะมีมากกว่าหนึ่งรายการพร้อมวันที่ที่กำหนด

ตารางของฉันยังต้องการคอลัมน์ ID หรือไม่ ถ้าเป็นเช่นนั้นข้อดีของการใช้ ID เป็นตัวระบุบันทึกซึ่งตรงข้ามกับวันที่คืออะไร?


SQLite จะสร้างคอลัมน์จำนวนเต็มสำหรับ rowid เสมอหากคุณไม่ได้ระบุ PK จำนวนเต็ม ดังนั้นอย่าวางใจว่าไม่มีคอลัมน์ "ID" เป็นวิธีการประหยัดพื้นที่
Codism

ฉันจะเพิ่มสิ่งนั้นใน Android บางคลาสต้องการตารางเพื่อให้คอลัมน์ _id ทำงานได้ ข้อมูลเพิ่มเติมที่คำตอบนี้
bigstones

5
หากคุณได้รับวันที่จากโทรศัพท์และผู้ใช้เดินทางไปยังโซนเวลาก่อนหน้า (และ / / โทรศัพท์ของเขา / เธออัพเดทเวลาโดยอัตโนมัติ) ดังนั้นมีโอกาสเล็กน้อยที่คุณจะได้รับการประทับเวลาเดียวกันมากกว่าหนึ่งครั้ง
ยูจีน

คำตอบ:


22

IMHO การหลีกเลี่ยงการใช้คอลัมน์วันที่เป็นคีย์หลักจะดีที่สุด

ฉันทำงานกับระบบที่มีการใช้ฟิลด์วันที่เป็นคีย์หลักและเขียนคิวรีเพื่อดึงข้อมูลย่อยของข้อมูลนั้นเป็นการลากหากคุณทำงานกับเขตข้อมูลวันที่

ประเด็นอื่น ๆ ที่คุณอาจต้องการพิจารณา:

คุณอาจคิดว่าจุดในเวลานั้นไม่เหมือนใคร แต่ขึ้นอยู่กับความละเอียดของคอลัมน์วันที่ มันเป็นนาทีวินาทีมิลลิวินาที ฯลฯ คุณสามารถเป็นอย่างแน่ใจว่าคุณจะไม่เคยได้รับการละเมิดคีย์หลัก?

ท้ายที่สุดหากคุณต้องการย้ายฐานข้อมูลไปยังแพลตฟอร์มอื่นคุณอาจประสบปัญหาอีกครั้งที่ข้อมูลวันที่แตกต่างกันระหว่างแพลตฟอร์ม

แน่นอนคุณต้องสมดุลในอุดมคติกับสิ่งที่คุณต้องทำงานด้วย หากช่องว่างเป็นเรื่องที่น่าเป็นห่วงมากการใช้คอลัมน์วันที่อาจเป็นความชั่วร้ายที่น้อยกว่า นั่นคือการตัดสินใจออกแบบที่คุณต้องทำ

แก้ไข:

ฉันควรชี้ให้เห็นว่าสิ่งนี้ไม่ได้บ่งชี้ว่ามันเป็นการตัดสินใจที่ไม่ดีนัก เพียงแค่ว่าอาจมีปัญหากับการปฏิบัติของ RDBMS ในคำถาม


มันไม่นานมาแล้วตั้งแต่ฉันเขียนแบบสอบถาม SQLite แต่ไม่ได้กรองตามวันที่เหมือนกับการกรองด้วยจำนวนเต็มนอกเหนือจากการประกาศ verbose เพิ่มเติมของค่าผูกพัน
DougM

เป็นเพียง verbose มากขึ้นและใน RDBMS บางส่วนที่คุณได้รับปัญหาที่องค์ประกอบวันและเดือนกลับถ้าฐานข้อมูลที่ได้รับการตั้งค่าในรูปแบบสหรัฐอเมริกา
Robbie Dee

ขอบคุณเหล่านี้คือคำตอบที่ดี แต่ประสบการณ์ในการทำงานของคุณได้ปิดผนึกข้อตกลงไว้อย่างแน่นอน
Nieszka

จากบทความนี้: เฉพาะวันนี้ฉันได้รับปัญหาการสนับสนุนสำหรับตารางการตรวจสอบแอปพลิเคชันที่พวกเขาได้รับการละเมิดคีย์หลักสำหรับหมายเลขพนักงานและการเข้าถึงวันที่ / เวลา PK เนื่องจากความแตกต่างของเวลาระหว่างอุปกรณ์ไคลเอนต์ 2 เครื่อง ..
Robbie Dee

13

ไม่คุณไม่จำเป็นต้องมีคอลัมน์ ID ที่กำหนดไว้ในสคีมาของคุณอย่างเคร่งครัดหากคุณสามารถรับประกันได้ว่าจะไม่มีวันที่ซ้ำกัน

แต่ ...

... ที่บอกว่าคุณอาจใช้มันดีอยู่ดี ความลับเล็ก ๆ น้อย ๆ ที่นี่คือ SQLite มี ID ที่เพิ่มขึ้นอัตโนมัติซึ่งไม่ซ้ำกันสำหรับทุกตารางที่เรียกว่า ROWID หากคุณประกาศคอลัมน์จำนวนเต็มที่เพิ่มขึ้นอัตโนมัติในตารางของคุณเป็น PK, SQLite จะไม่สร้างคอลัมน์ใหม่ - มันจะเป็นเพียงนามแฝงคอลัมน์ ROWID ที่มีอยู่แล้ว

ใน SQLite ทุกแถวของทุกตารางมีจำนวนเต็มแบบ 64 บิตที่ลงนามแล้ว ROWID สำหรับแต่ละแถวไม่ซ้ำกันในทุกแถวในตารางเดียวกัน

คุณสามารถเข้าถึง ROWID ของตาราง SQLite โดยใช้ชื่อคอลัมน์พิเศษ ROWID, ROWIDหรือ OID ยกเว้นถ้าคุณประกาศคอลัมน์ตารางธรรมดาให้ใช้ชื่อพิเศษเหล่านั้นการใช้ชื่อนั้นจะอ้างถึงคอลัมน์ที่ประกาศไม่ให้เป็น ROWID ภายใน

หากตารางมีคอลัมน์ประเภท INTEGER Primary KEY คอลัมน์นั้นจะกลายเป็นนามแฝงสำหรับ ROWID จากนั้นคุณสามารถเข้าถึง ROWID โดยใช้ชื่อที่แตกต่างกันสี่ชื่อสามชื่อเดิมที่อธิบายไว้ข้างต้นหรือชื่อที่ให้ไว้ในคอลัมน์ INTEGER Primary KEY ชื่อเหล่านี้เป็นชื่อแทนกันและทำงานได้ดีในบริบทใด ๆ

http://www.sqlite.org/autoinc.html

ดังนั้นคุณจะไม่ประหยัดพื้นที่ใด ๆ โดยไม่ใช้คอลัมน์ ID เนื่องจากคุณได้รับหนึ่งรายการต่อตารางไม่ว่าคุณต้องการหรือไม่!


9

ใช้ฟิลด์ ID หากรายการใด ๆ ต่อไปนี้เป็นจริง:

  1. ไม่มีคีย์ธรรมชาติ (วันที่จะไม่ซ้ำกัน)
  2. ฟิลด์วันที่จะมีการเปลี่ยนแปลงบ่อยครั้ง
  3. อาจไม่ทราบวันที่ในช่วงเวลาของการแทรก
  4. ตัวระบุหลายคอลัมน์มีจำนวนเกินสามคอลัมน์ซึ่งจะทำให้การเข้าร่วม verbose มากเกินไป

อ่านคำถามนี้: มีแหล่งอ้างอิงที่รองรับ "ตัวแทนเสมือน" หรือไม่?

แก้ไข:

เนื่องจากในความคิดของฉันดูเหมือนว่าไม่มีการเก็บข้อมูลข้างต้นจริงคุณไม่จำเป็นต้องใช้และ ID ฟิลด์ แต่คุณสามารถใช้ถ้าคุณต้องการ


1
คอลัมน์ +1 ID เป็นกลิ่นรหัสสคีมาซึ่งแสดงว่าข้อมูลของคุณไม่ตรงกับโมเดลเชิงสัมพันธ์
Ross Patterson

10
@RossPatterson ฉันไม่แน่ใจ ฉันสามารถคิดถึงหลายกรณีที่ไม่มีคีย์ธรรมชาติอาจมีอยู่ แต่ข้อมูลยังคงพอดีกับโมเดลเชิงสัมพันธ์ มีเพียงกรณีเดียวที่อยู่บนหัวฉัน: จัดเก็บข้อมูลเกี่ยวกับบุคคลที่มีชีวิต หลายประเทศ ( ไม่ใช่ทั้งหมด! ) กำหนดตัวระบุที่ไม่ซ้ำกันให้กับพลเมืองแต่ละคน แต่นั่นไม่ได้หมายความว่าการใช้ตัวระบุนั้นมีความเหมาะสมหรือเป็นไปได้ อาจถูกห้ามเช่นตามข้อบังคับที่บังคับใช้) นั่นหมายความว่าข้อมูลไม่ตรงกับตัวแบบเชิงสัมพันธ์หรือไม่? ฉันไม่คิดอย่างนั้น
CVn

และมีข้อเท็จจริงที่ตลกเล็กน้อยที่บางครั้งมีตัวระบุที่ไม่ซ้ำกันตำรวจ (ฯลฯ ) ใช้สำเนาที่ซ้ำกันสำหรับรหัสปลอมของพวกเขา และเมื่อไม่มีเจตนาข้อผิดพลาดทางเสมียนจะรับรองความซ้ำซ้อนอยู่ดี
user470365

4
ไม่ว่าจะถูกสร้างขึ้นใน (a la Oracle) หรือเพิ่มเป็นคอลัมน์ bona fide พวกมันมีประโยชน์มาก ในฐานะที่เป็นคนที่อยู่ทั้งสองด้านของรั้ว (DBA & ผู้พัฒนา) มันง่ายกว่าที่จะลดความซ้ำซ้อนของตารางที่มี ID ที่คุณสามารถรับประกันได้ว่าจะไม่ซ้ำกัน
Robbie Dee

1
@ RobbieDee คุณพูดถูก มันอยู่นอกหัวข้อ
Tulains Córdova

2

โปรดทราบว่าคุณอาจต้องการเปลี่ยนความหมายของคอลัมน์ "วันที่" จากcreated_atเป็นupdated_atหรือเปลี่ยนแปลงอื่น ๆ ตามบรรทัดเหล่านั้นซึ่งฉันคิดว่าเป็นกรณีที่พบบ่อยมาก

การเพิ่มคอลัมน์ id ในบางกรณีจะทำให้คุณมีความยืดหยุ่นมากขึ้นเมื่อการเปลี่ยนแปลงการออกแบบของคุณ


+1 การเพิ่ม date_created และ date_modified ลงในตารางมีประโยชน์อย่างมากสำหรับการติดตามเมื่อมีการสร้างและอัปเดตแถว นี่คือน้ำหนักของมันเป็นทองคำเมื่อตรวจสอบปัญหาการอัพเดทคลังเก็บข้อมูล /
Robbie Dee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.