เหตุใดการตั้งชื่อคอลัมน์คีย์หลักของตาราง“ Id” จึงถือว่าไม่เหมาะสม [ปิด]


210

ครู t-sql ของฉันบอกเราว่าการตั้งชื่อคอลัมภ์ PK "Id" ของเรานั้นถือว่าเป็นการฝึกที่ไม่ดีโดยไม่มีคำอธิบายใด ๆ เพิ่มเติม

เหตุใดการตั้งชื่อคอลัมน์คอลัมน์ "PK" ของตาราง PK จึงถือว่าไม่เหมาะสม


27
ไม่ใช่คำอธิบายจริงๆแล้ว Id หมายถึง "ตัวตน" ซึ่งเป็นคำอธิบายที่ดีมาก นั่นคือความคิดเห็นของฉัน
Jean-Philippe Leclerc

49
ฉันแน่ใจว่ามีร้านค้ามากมายที่ใช้ Id เป็นชื่อ PK ฉันเองใช้ TableId เป็นแบบแผนการตั้งชื่อของฉัน แต่ฉันจะไม่บอกใครเลยว่ามันคือ THE ONE TRUE WAY ดูเหมือนว่าครูของคุณกำลังพยายามแสดงความคิดเห็นของเธอว่าเป็นวิธีปฏิบัติที่ดีที่สุดที่ยอมรับกันอย่างกว้างขวาง

22
ประเภทของการปฏิบัติที่ไม่ดีที่ไม่เลว ประเด็นคือเพื่อให้สอดคล้อง หากคุณใช้รหัสให้ใช้งานได้ทุกที่หรือไม่ได้ใช้
deadalnix

57
คุณมีตาราง ... มันเรียกว่าคนมันมีคอลัมน์ชื่อ Id คุณคิดว่า Id คืออะไร? รถ? เรือ? ... ไม่เป็นรหัสประจำตัวประชาชนเท่านั้นแหละ ฉันไม่คิดว่ามันไม่ใช่วิธีปฏิบัติที่ไม่ดีและไม่จำเป็นต้องตั้งชื่อคอลัมน์ PK นอกเหนือจาก Id
จิม

38
ดังนั้นคุณครูจึงมาอยู่หน้าชั้นเรียนและบอกคุณว่านี่เป็นการฝึกฝนที่ไม่ดีโดยไม่มีเหตุผล? นั่นเป็นวิธีปฏิบัติที่แย่กว่าสำหรับครู
JeffO

คำตอบ:


247

ฉันจะออกมาและบอกว่ามัน: มันไม่ได้จริงๆปฏิบัติไม่ดี (และแม้ถ้ามันเป็นไม่ได้ว่าไม่ดี)

คุณสามารถสร้างข้อโต้แย้ง (ตามที่ชาดชี้) ว่าสามารถปกปิดข้อผิดพลาดเช่นในแบบสอบถามต่อไปนี้:

SELECT * 
    FROM cars car
    JOIN manufacturer mfg
        ON mfg.Id = car.ManufacturerId
    JOIN models mod
        ON mod.Id = car.ModelId
    JOIN colors col
        ON mfg.Id = car.ColorId

แต่สิ่งนี้สามารถบรรเทาได้ง่าย ๆ โดยไม่ใช้นามแฝงเล็ก ๆ สำหรับชื่อตารางของคุณ:

SELECT * 
    FROM cars
    JOIN manufacturer
        ON manufacturer.Id = cars.ManufacturerId
    JOIN models
        ON models.Id = cars.ModelId
    JOIN colors
        ON manufacturer.Id = cars.ColorId

การปฏิบัติของการเสมอโดยใช้ตัวย่อ 3 idตัวอักษรดูเหมือนว่าเลวร้ายมากกับผมกว่าการใช้ชื่อคอลัมน์ (ในกรณี: ใครจะเป็นตัวย่อชื่อตารางcarsด้วยตัวย่อจริง ๆ แล้วcarมันทำหน้าที่อะไร?)

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

มุ่งเน้นที่การเรียนรู้สิ่งต่าง ๆ ที่เป็นการปฏิบัติที่ไม่ดีจริง ๆ (เช่นแบบสอบถามย่อยที่สัมพันธ์กันหลายรายการ) แทนที่จะครุ่นคิดมากกว่าประเด็นเช่นนี้ ปัญหาของการตั้งชื่อคอลัมน์ "ID" ของคุณนั้นใกล้เคียงกับรสนิยมมากกว่าการฝึกฝนที่ไม่ดี


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


1
@Chad มันมีการอ้างอิงถึงความจริงที่ว่าในการสืบค้นเฉพาะนั้นคุณใช้ตัวอักษร 3 ตัวสำหรับนามแฝงถึงชื่อตารางแม้ว่าจะไม่มีเหตุผลก็ตาม( cars-> car. ขอบคุณพระเจ้า - คุณช่วยชีวิตฉันด้วยนิ้ว) อย่าอ่านมันอย่างลึกซึ้งเกินไป
riwalk

3
เลวร้ายยิ่งกว่าชื่อนามแฝงของฉันเป็นของฉันผสมของหลายฝ่ายและcars manufacturerหนึ่งคือพหูพจน์อื่น ๆ ไม่ได้ ถ้าคนต้องการเลือกที่ db นั่นเป็นวิธีปฏิบัติที่ไม่ดีที่ควรเลือก
CaffGeek

3
ฉันคิดว่ามันเป็นการปฏิบัติที่ไม่ดี เห็นได้ชัดว่าตราบใดที่การปฏิบัติที่ไม่ดีนั้นก็ไม่ได้แย่มาก .. แต่มันก็ง่ายที่จะหลีกเลี่ยงทำไมไม่ทำอย่างนั้น? ตอนนี้ฉันเห็นด้วยสำหรับชั้นเรียนอินโทรนี่คือสิ่งที่จะมุ่งเน้นหรือไม่ อาจไม่ ....
606723

2
@ user606723 ที่จริงฉันคิดว่าสำหรับชั้นเรียนอินโทรเป็นสิ่งสำคัญที่จะทำให้จุด การสอนวิธีปฏิบัติที่ดีที่สุดควรเป็นพื้นฐาน มันไม่ได้จนกว่าคุณจะมีประสบการณ์ที่คุณเข้าใจผลที่ตามมาและการแลกเปลี่ยนและเมื่อคุณควรเบี่ยงเบนจากแนวทางปฏิบัติที่ดีที่สุด
CaffGeek

5
@Chad เห็นด้วยที่จะไม่เห็นด้วย การพยายามสอนให้นักเรียน“ ปฏิบัติที่ดีที่สุด” โดยไม่ให้พวกเขาเข้าใจว่าทำไมการปฏิบัติที่ดีที่สุดเหล่านี้จึงเป็นความพยายามที่ไร้ประโยชน์ และเนื่องจากคุณไม่สามารถปิดบังทุกอย่างได้มันวาวด้วยจุดนี้ด้วย "คุณไม่ควรทำมันคุณจะเข้าใจว่าทำไมในภายหลัง" เป็นทางเลือกที่มีเหตุผลจากมุมมองของอาจารย์ นักเรียนที่อยากรู้อยากเห็นสามารถโพสต์ที่นี่หรือหวังว่าจะพบคำถามนี้ตอบแล้ว (หรือถามหลังเลิกเรียน)
606723

123

เพราะเมื่อคุณมีตารางที่มีรหัสต่างประเทศคุณจะไม่สามารถตั้งชื่อรหัสต่างประเทศ "รหัส" ได้ คุณมีชื่อตารางว่า TableId

และจากนั้นการเข้าร่วมของคุณดูเหมือน

SELECT * FROM cars c JOIN manufacturer m ON m.Id = c.ManufacturerId

และในอุดมคติเงื่อนไขของคุณควรมีชื่อเขตข้อมูลเดียวกันในแต่ละด้าน

SELECT * FROM cars c JOIN manufacturer m ON m.ManufacturerId = c.ManufacturerId

ดังนั้นในขณะที่ดูเหมือนว่าซ้ำซ้อนในการตั้งชื่อ Id เป็น ManufacturerId ทำให้มีโอกาสน้อยกว่าที่คุณจะมีข้อผิดพลาดในเงื่อนไขการเข้าร่วมของคุณ

สิ่งนี้ดูเรียบง่าย แต่เมื่อคุณเข้าร่วมหลาย ๆ โต๊ะมันจะมีโอกาสมากขึ้นที่คุณจะทำผิดพลาดหาตารางด้านล่าง ...

SELECT * 
    FROM cars car 
    JOIN manufacturer mfg
        ON mfg.Id = car.ManufacturerId
    JOIN models mod
        ON mod.Id = car.ModelId
    JOIN colors col
        ON mfg.Id = car.ColorId

ในขณะที่มีการตั้งชื่อที่เหมาะสมข้อผิดพลาดก็โผล่ออกมา ...

SELECT * 
    FROM cars car 
    JOIN manufacturer mfg
        ON mfg.ManufacturerId = car.ManufacturerId
    JOIN models mod
        ON mod.ModelId = car.ModelId
    JOIN colors col
        ON mfg.ManufacturerId = car.ColorId

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

SELECT   manufacturer.Id as 'ManufacturerId'
        ,cars.Id as 'CarId'
        --etc
    FROM cars 
    JOIN manufacturer
        ON manufacturer.Id = cars.Id

ด้วยชื่อที่ถูกต้องนี่เป็นปัญหาน้อยกว่า


174
ไม่แน่ใจว่านี่เป็นคำอธิบายที่ดีสำหรับฉัน SELECT * FROM cars c JOIN manufacturer m ON manufacturer.Id = c.ManufacturerIdไม่มีอะไรผิดปกติกับบอกว่า ฉันใช้มาidหลายปีแล้วและไม่เคยพบสิ่งที่คุณอธิบายว่าเป็นปัญหาจริง
riwalk

61
ฉันจะบอกว่าการปฏิบัติที่ไม่ดีที่นี่คือนามแฝงตารางที่มีชื่อเช่น mfg หรือ mod manufacturers.id = cars.manufacturer_id สามารถอ่านได้มากและข้อผิดพลาดก็จะปรากฏออกมาเช่นกัน
deadalnix

5
@Chad> ฉันมีปัญหากับชื่อตัวแปรใบ้ หลายครั้ง. สำหรับ reccord นี่คือสิ่งที่ฉันจะพูดกับนักพัฒนาที่ทำสิ่งนี้ในทีมของฉัน« mfg ไม่ได้แปลว่าผู้ผลิตหมายความว่าคุณขี้เกียจที่จะพิมพ์ผู้ผลิต»
deadalnix

9
@ Stargazer712: การเลือก SELECT * จาก 2 ตารางจะให้คอลัมน์ 2 x ID ID ตอนนี้ไม่ชัดเจน: คุณอ้างอิงตามลำดับหรือชื่อ? SELECT * ไม่ใช่วิธีปฏิบัติที่ดีเช่นกัน อาร์กิวเมนต์ไม่ดี รหัสเปราะบาง แช้ดถูกต้อง: การป้องกันแบบพื้นฐานโดยทั่วไป
gbn

6
@gbn SELECT manufacturer.id FROM ...อีกครั้งคลุมเครือทั้งหมดจะหายไปถ้าคุณเพียงแค่ทำ ความยากลำบากทุกอย่างที่เกิดจากidสามารถเอาชนะได้ง่ายมากทำให้เป็นเรื่องของการลิ้มรส
riwalk

67

ไลบรารี ActiveRecord ของรูบี้และ GORM ของ Groovy ใช้ "id" สำหรับคีย์ตัวแทนโดยค่าเริ่มต้น ฉันชอบการปฏิบัตินี้ การทำซ้ำชื่อตารางในแต่ละชื่อคอลัมน์ซ้ำซ้อนน่าเบื่อเขียนและน่าเบื่ออ่าน


30
+1 สำหรับ "และน่าเบื่ออ่าน" - การตั้งชื่อแบบแผนไม่ควรถูกมองว่าเป็นตัวช่วยแบนด์สำหรับโค้ดเลอะเทอะพวกเขาควรจะปรับปรุงความสามารถในการอ่านเป็นข้อกังวลหลัก
ocodo

12
ID น่าเบื่อมากที่จะอ่าน
HLGEM

5
@HLGEM: สามารถระบุชื่อคอลัมน์ด้วยชื่อตารางได้เสมอ
วินไคลน์

2
ฉันจะเห็นด้วยยกเว้นที่น่าเบื่อมากขึ้นในการอ่าน ฉันชอบอ่านชื่อคอลัมน์ที่มีความหมายมากกว่าและใช้เวลาน้อยลงในการหาว่าคอลัมน์นั้นมีไว้เพื่ออะไร
Devin Dixon

2
+1, เกลียดการดูตารางที่มีคอลัมน์เช่น Posts.postID, Posts.postName ซึ่งการใช้ post.id และ post.name นั้นน่ารักกว่ามาก
Doug

40

ชื่อคอลัมน์ทั่วไปหรือคีย์เช่น "ชื่อ" หรือ "Id" ควรขึ้นต้นด้วย TableName

มันลบความคลุมเครือง่ายต่อการค้นหาหมายถึงชื่อแทนคอลัมน์ที่น้อยลงเมื่อต้องการค่า "Id" ทั้งคู่

คอลัมน์ที่ใช้น้อยลงหรือตรวจสอบหรือไม่ใช่คีย์ (พูด LastUpdatedDateTime) ไม่สำคัญ


57
หากคุณทำสิ่งนี้ฉันเกลียดคุณที่ทำให้ฉันพิมพ์เป็นพิเศษ !!!! ชื่อของตารางคือบุคคลคุณคิดว่ารหัสจะเป็นอย่างไร รถยนต์? ไม่เป็นบุคคล
จิม

16
@ จิมฉันไม่รู้เกี่ยวกับคุณ แต่การพิมพ์ตัวอักษรพิเศษ 6 ตัวทำให้ฉันใช้เวลาประมาณครึ่งวินาที และเมื่อพิจารณาว่าฉันไม่ค่อยเลือกจากตารางหนึ่งและจะจบลงด้วยสองคอลัมน์ชื่อ 'Id' และจะต้องรวมชื่อตาราง / นามแฝงด้วยวิธีใดไม่มีการประหยัดจำนวนอักขระที่พิมพ์ลงไป
CaffGeek

21
@Chad ฉันพบว่ามันฟุ่มเฟือย ถ้าฉันเข้าร่วม c.id = m.manufacturerid ก็โอเคกับฉัน คอลัมน์เหล่านี้มักจะ "แมป" กับคลาสอย่างใดและการมีคลาสกับ Person.PersonId ทำให้ฉันอยากอาเจียน ... ใช่ฉันรู้ตัวดีว่าฉันมีปัญหา
จิม

20
ฉันไม่เห็นด้วยกับสิ่งนี้ หยุดที่nameและidทำไม เหตุใดจึงไม่มีทุกคอลัมน์นำหน้าด้วยชื่อตาราง ดูเหมือนว่าจะเลือกชื่อทั้งสองเหล่านั้นโดยพลการ แนวคิดคุณต้องมีตารางเพื่อให้มีบริบทของคอลัมน์อยู่ดี เหตุใดจึงไม่ใช้ชื่อตารางนั้นเพื่อชี้แจงข้อความค้นหา: Person.Name, Animal.Name, Part.Name, ...
Thomas

11
@Bill Leeper, DRY อาจไม่เหมาะสมในการพัฒนาฐานข้อมูลเสมอไป ในฐานข้อมูลสิ่งที่สำคัญคือประสิทธิภาพและการทำให้ฐานข้อมูลทำงานพิเศษเพื่อเติมเต็มหลักการ DRY (เช่นการใช้ฟังก์ชันสเกลาร์หรือมุมมองที่เรียกใช้มุมมองหรือคิวรีที่ส่งคืนคอลัมน์มากเกินไปหรือใช้เคอร์เซอร์เพื่อเพิ่มระเบียน 1000000 เพื่อใช้ proc ที่มีอยู่) มักจะมีข้อห้าม อย่าคิดว่าเพียงเพราะบางสิ่งดีในโลกแห่ง Object-oriented ที่เหมาะสมในการออกแบบฐานข้อมูล downvote ของคุณไม่เหมาะสม การใช้ ID เป็นที่รู้จัก SQL antipattern
HLGEM

31

เธรดนี้ตายแล้ว แต่ฉันต้องการเพิ่มว่า IMO ที่ไม่ได้ใช้Idนั้นเป็นวิธีปฏิบัติที่ไม่ดี Idคอลัมน์พิเศษ มันเป็นคีย์หลัก ตารางใด ๆ สามารถมีคีย์ต่างประเทศจำนวนเท่าใดก็ได้ แต่สามารถมีคีย์เดียวเท่านั้นที่เป็นคีย์หลัก ในฐานข้อมูลที่มีการเรียกคีย์หลักทั้งหมดทันทีที่คุณดูตารางคุณจะรู้ว่าคอลัมน์ใดเป็นคีย์หลักId

ฉันเชื่อว่าสำหรับเดือนนี้ฉันได้ใช้เวลาทุกวันทุกวันทำงานในจำนวนมากของฐานข้อมูลขนาดใหญ่ (Salesforce) Idและสิ่งที่ดีที่สุดที่ฉันสามารถพูดเกี่ยวกับสกีมาคือการที่ทุกตารางมีคีย์หลักที่เรียกว่า ฉันสามารถรับประกันคุณฉันอย่างไม่เคยได้รับสับสนเกี่ยวกับการเข้าร่วมคีย์หลักไปยังต่างประเทศที่สำคัญเพราะ PK Idที่เรียกว่า อีกสิ่งที่ผู้คนไม่ได้กล่าวถึงก็คือตารางอาจมีชื่อที่โง่ ๆ เช่นTable_ThatDoesGood_stuff__c; ชื่อนั้นไม่ดีพอเนื่องจากสถาปนิกมีอาการเมาค้างในตอนเช้าเขาคิดว่าตาราง แต่ตอนนี้คุณกำลังบอกฉันว่ามันเป็นวิธีปฏิบัติที่ไม่ดีที่จะไม่เรียกคีย์หลักTable_ThatDoesGood_stuff__cId (จำได้ว่าชื่อคอลัมน์ SQL ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก)

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


2
นั่นเป็นเพียงกรณีที่ไม่มีคีย์หลักของคุณเป็นคีย์ผสมซึ่งไม่สะดวกสบายบ่อยเกินไปในกรณี เราควรใช้กุญแจตัวแทนในสถานการณ์เฉพาะเท่านั้น
nicodemus13

6
การใช้รหัสเช่นนั้นคุณจะจบลงด้วยสถานการณ์ที่ผู้พัฒนาไม่คิดว่าจะเพิ่มรหัสคีย์หลักในแต่ละตารางที่พวกเขาทำ หนึ่งในรากฐานของฐานข้อมูลเชิงสัมพันธ์คือการใช้คีย์ความหมายแบบเต็มและรวมคีย์และการใช้ id ไม่ได้ช่วย
Pieter B

คำตอบนี้ดูเหมือนว่าคุณกำลังพูดว่า "ฉันชอบรหัส" ด้วยการโต้แย้งที่มีความเห็น อาร์กิวเมนต์ของคุณคือคุณสามารถดูได้ทันทีว่าคีย์ใดเป็นคีย์หลักโดยการค้นหาหนึ่งชื่อ Id ดีมันเป็นที่แน่นอนเดียวกันกับรหัสตาราง ฉันรับประกันได้ว่าคุณจะไม่สับสนว่ากุญแจตัวใดเป็นกุญแจหลัก ฉันแค่มองหาคนที่มีชื่อตารางก่อน id ไม่เพียงแค่นั้น แต่ตารางของคนต่างชาติที่คุณทำงานด้วยโดยที่คอลัมน์แรกไม่ใช่คีย์หลัก ฉันรู้สึกว่าทุกข้อโต้แย้งของคุณในคำตอบนี้เป็นไปตามสิทธิพิเศษหมดจดและคล้ายกับ "tableId รู้สึกผิดกับฉัน"
dallin

@dallin คำตอบทั้งหมดจะได้รับการวิพากษ์วิจารณ์มิฉะนั้นบางคนก็จะเชื่อมโยงกับมาตรฐานอย่างเป็นทางการและไม่มีใคร!
James

@ James ฉันรู้สึกว่าเป้าหมายของเว็บไซต์ StackExchange คือลดคำตอบที่ได้รับความเห็น นั่นเป็นสาเหตุที่ทำให้คำถามถูกปิดเพราะเห็นด้วยเกินไป จริงอยู่ที่ฉันคิดว่านั่นเป็นเหตุผลว่าทำไมคำถามนี้ถึงถูกปิดเพราะมันทำให้เกิดคำตอบที่ให้ความเห็น แต่ฉันรู้สึกว่าคำตอบที่เฉพาะเจาะจงนี้ถูกให้ความเห็นมากเกินไปโดยไม่มีข้อเท็จจริงหรือข้อโต้แย้งใด ๆ ความเห็นของฉันคุณควรใช้ Id เพียงเพราะนั่นคือสิ่งที่ฉันชอบ " นั่นไม่ใช่คำตอบที่มีค่า
dallin

24

ฉันไม่คิดว่ามันเป็นการปฏิบัติที่ไม่ดี ความมั่นคงเป็นราชาเช่นเคย

ฉันคิดว่ามันเป็นเรื่องของบริบท ในบริบทของตารางด้วยตนเอง "id" นั้นหมายถึงสิ่งที่คุณคาดหวังฉลากที่จะช่วยระบุตัวตนที่ไม่ซ้ำกับผู้อื่นที่อาจเป็น (หรือปรากฏ) เหมือนกัน

ในบริบทของการรวมเป็นความรับผิดชอบของคุณในการสร้างการรวมในลักษณะที่ทำให้คุณและทีมของคุณสามารถอ่านได้ เช่นเดียวกับที่เป็นไปได้ที่จะทำให้สิ่งต่าง ๆ ดูยากด้วยการใช้ถ้อยคำหรือการตั้งชื่อที่ไม่ดีก็เป็นไปได้ที่จะสร้างแบบสอบถามที่มีความหมายด้วยการใช้นามแฝงที่มีประสิทธิภาพและแม้แต่ความคิดเห็น

ในทำนองเดียวกันคลาส Java ที่ชื่อว่า 'Foo' ไม่มีคุณสมบัตินำหน้าด้วย 'Foo' อย่ารู้สึกว่าจำเป็นต้องนำหน้า ID ตารางของคุณด้วยชื่อตาราง โดยทั่วไปจะชัดเจนในบริบทที่ ID ที่อ้างถึงคืออะไร


5
ตารางฐานข้อมูลเชิงสัมพันธ์ไม่ได้เรียน
อดัมโรบินสัน

1
อย่างไรก็ตามเป็นโครงสร้างข้อมูลและคล้ายกับคลาส PODO ใช้ปัญหาการตั้งชื่อเดียวกัน
ocodo

4
@Slomojo: ไม่พวกมันไม่คล้ายกับวัตถุธรรมดา การออกแบบเชิงวัตถุและการออกแบบฐานข้อมูลนั้นไม่เหมือนกันและไม่เกี่ยวข้องกัน ในขณะที่สามารถทำได้ในบางกรณีให้ผลการออกแบบที่คล้ายกัน (หรือเหมือนกัน) ซึ่งไม่ได้ระบุว่าเกี่ยวข้องกัน ตัวอย่างเช่นความสัมพันธ์ m: m มีความสำคัญในชั้นเรียน แต่เป็นไปไม่ได้มีสองตารางโดยไม่มีตารางการเชื่อมโยงที่สาม
Adam Robinson

1
ค่อนข้างจะเกี่ยวข้องกับกลยุทธ์การตั้งชื่อฉันไม่รู้ การเปรียบเทียบของฉันคือ (ชัดเจน) เฉพาะขอบเขตเท่านั้น
ocodo

2
ฉันขอโทษความหมายโดยนัยของฉันไม่ชัดเจนฉันควรจะพูดว่า " ในแง่นี้พวกเขามีความคล้ายคลึงกับชั้นเรียน" ไม่ว่าจะด้วยวิธีใดฉันไม่คิดว่าเรื่องนี้จะสร้างสรรค์มากเกินไป ในแง่ของการตั้งชื่อตารางและคลาสจะมีความคล้ายคลึงกันในปริมาณที่มาก แนวปฏิบัติที่ดีที่สุดที่พัฒนาใน Cul-de-Sac เป็นเกมที่ยุติธรรมสำหรับการแก้ไขหรืออย่างน้อยก็เปิดให้มีการอภิปราย มีคำถามและคำตอบมากมายที่แสดงถึงสิ่งนี้ได้อย่างมีประสิทธิภาพฉันไม่มีอะไรที่จะต้องเพิ่ม
ocodo

24

จากdata.stackexchange.com

รหัสในกระทู้

บูมตอบคำถามแล้ว
ตอนนี้ไปบอกครูของคุณว่าดังนั้นฝึกการออกแบบฐานข้อมูลที่ไม่ดี


8
ฉันเดาที่ FKs ตามชื่อ: PostTypeId -> PostTypes.Id; AcceptedAnswerId -> Answers.Id; OwnerUserId -> Users.Id. ทำไมการฝึกที่ถือว่าง่ายนั้นควรถือว่า 'ไม่ดี'?
Sjoerd

3
สิ่งนี้พิสูจน์ได้อย่างแม่นยำว่าอะไรเกี่ยวกับแนวปฏิบัติที่ดีที่สุด
GBa

5
ไม่ว่าจะมีบางสิ่งที่ใช้ในกองซ้อนหรือไม่ไม่สามารถพิสูจน์ได้ว่าเป็นการปฏิบัติที่ดีหรือไม่ดี
Pieter B

2
สิ่งที่พิสูจน์ได้ก็คือการปฏิบัตินี้ไม่ได้ขัดขวางการปรับขนาดและประโยชน์ของแอปพลิเคชัน
Cypher

1
จริงๆแล้วการฝึกซ้อมนั้นไม่สมบูรณ์แบบ ฉันจะใช้การตั้งชื่อนี้: PostType -> PostType.Id; AcceptedAnswer -> Answer.Id; OwnerUser -> User.Id
alpav

17

มันทำให้ยาก (และสับสน) ในการเล่นแบบธรรมชาติบนโต๊ะดังนั้นใช่มันไม่ดีถ้าไม่แย่มาก

การเข้าร่วมแบบธรรมชาติเป็นสิ่งประดิษฐ์โบราณของ SQL Lore (เช่นพีชคณิตเชิงสัมพันธ์) ที่คุณอาจเคยเห็นหนึ่งในนี้: ⋈ในหนังสือฐานข้อมูลบางที สิ่งที่ฉันหมายถึงคือ Natrual Join ไม่ใช่แนวคิด SQL แบบใหม่ แต่ดูเหมือนว่าจะต้องใช้ตลอดไปเพื่อให้ DBMS ใช้งานได้ดังนั้นจึงไม่ใช่ความคิดแบบใหม่สำหรับคุณที่จะนำไปใช้งาน การดำรงอยู่ของมันในปัจจุบัน

ถ้าคุณตั้งชื่อ ID หลักทั้งหมดของคุณคุณจะเสียความสะดวกและความเรียบง่ายของการเข้าร่วมแบบธรรมชาติ select * from dudes natural join carsจะต้องมีการเขียนselect * from dudes inner join cars where cars.dudeid = dudes.idหรือselect * from dudes inner join cars where dudes.carid = cars.id. หากคุณสามารถเข้าร่วมได้อย่างเป็นธรรมชาติคุณจะไม่สนใจว่าความสัมพันธ์คืออะไรซึ่งฉันเชื่อว่ามันยอดเยี่ยมมาก


นอกจากว่าคุณกำลังเขียนขั้นตอนการจัดเก็บเมื่อครั้งสุดท้ายที่เป็นนักพัฒนาแอปพลิเคชันของคุณคุณได้เขียนตัวเลือก SQL ที่จัดรูปแบบเต็มแล้วจริง ๆ ? ภาษาสมัยใหม่ประกอบด้วยคุณลักษณะ ORM บางประเภทที่จัดการความสัมพันธ์นี้ให้คุณ ชื่อคอลัมน์มีความสำคัญมากกว่าความสามารถในการเขียน SQL แบบแมนนวล
Bill Leeper

4
@Bill ฉันทำตลอดเวลาหลายครั้งหลายต่อหลายครั้งขึ้นอยู่กับ codebase ของคุณมากกว่าภาษาที่คุณกำลังพัฒนา และสำหรับการวินิจฉัยหากคุณต้องการสร้างความสัมพันธ์ที่ดีและลึกซึ้งคุณสามารถรวมการรวมเข้าด้วยกันตามธรรมชาติและหลีกเลี่ยงการค้นหา ID ของฟิลด์อย่างสมบูรณ์ และดังที่นักบุญเจอโรมกล่าวไว้ว่า "ความไม่รู้ของ SQL คือความไม่รู้ของฐานข้อมูล"
Peter Turner

นอกเหนือจากความจริงที่ว่าการรวมธรรมชาติไม่ได้รับการสนับสนุนในระดับสากล IMO การรวมตามธรรมชาตินั้นยากที่จะอ่าน มีสองคอลัมน์ในความสัมพันธ์หรือเพียงหนึ่งคอลัมน์? ดีกว่าที่จะชัดเจนและหลีกเลี่ยงการเข้าร่วมธรรมชาติ
โทมัส

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

16

มีสถานการณ์ที่การติด "ID" ในทุกตารางไม่ใช่ความคิดที่ดีที่สุด: USINGคำหลักหากได้รับการสนับสนุน เราใช้บ่อยใน MySQL

ตัวอย่างเช่นหากคุณมีfooTableคอลัมน์fooTableIdและbarTableคีย์ต่างประเทศfooTableIdคุณสามารถสร้างคิวรีของคุณเช่น:

SELECT fooTableId, fooField1, barField2 FROM fooTable INNER JOIN barTable USING (fooTableId)

ไม่เพียงบันทึกการพิมพ์ แต่สามารถอ่านได้มากกว่าเมื่อเปรียบเทียบกับตัวเลือกอื่น ๆ :

SELECT fooTable.Id, fooField1, barField2 FROM fooTable INNER JOIN barTable ON (fooTable.Id = barTable.foTableId)

นี่คือคำตอบที่ดีที่สุดสำหรับฉัน USINGคำหลักคือการสนับสนุนจากฐานข้อมูล Postgres / MySQL / SQLite หมายถึงการพิมพ์น้อยซึ่งบางส่วนของรายการคำตอบอื่น ๆ เป็นเหตุผลในการใช้idและในที่สุดก็ในความคิดของฉันคืออัตนัยอ่านได้มากขึ้น
Michael Barton

11

ทำไมไม่ถามครู

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

ชื่อคอลัมน์จะต้องมีความหมายอย่างมีนัยสำคัญ IDคือทั่วไป


8
ทั่วไปเกินไปสำหรับอะไร ID ของตารางหรือไม่
จิม

3
@ จิมของตารางไหน idเพียงอย่างเดียวไม่ได้หมายความว่าอะไรโดยเฉพาะอย่างยิ่งในบริบทของ foreign key ไปยังตารางอื่น มันไม่เกี่ยวอะไรกับclassesการออกแบบฐานข้อมูลเชิงสัมพันธ์ขั้นพื้นฐานที่ดี

10
โต๊ะที่มันเป็นอยู่นั้นอ่อนไหวเล็กน้อย table.idเป็นวิธีที่อ้างถึงidเขตข้อมูลได้อย่างสมบูรณ์แบบ คำนำหน้าชื่อฟิลด์ด้วยชื่อตารางซ้ำซ้อน
ocodo

2
@Slomoj มันไม่ได้พิมพ์อะไรมากไปกว่าการใส่ชื่อในคอลัมน์และอธิบายเพิ่มเติมเมื่อตั้งชื่อนามแฝงของตารางเป็นอักษรย่อเดี่ยวหรือคู่ในมอนสเตอร์ที่เข้าร่วม

6
คุณกำลังพูดถึงฝันร้ายอะไร สมมติว่าคุณมีโครงสร้างการอ้างอิงตนเองของพนักงานที่มีคอลัมน์ที่แสดงถึงผู้จัดการของพวกเขา คุณเรียกคีย์ต่างประเทศว่าอะไร? คุณไม่สามารถเรียกมันว่า EmployeeId ได้นั่นก็คือ PK ของคุณ ชื่อของ FK ไม่จำเป็นต้องตรงกับ PK มันควรจะตั้งชื่อสำหรับสิ่งที่มันหมายถึงหน่วยงานที่มีอยู่
โทมัส

7

ID ไม่ถูกต้องเนื่องจากสาเหตุต่อไปนี้:

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

มันอาจทำให้เกิดข้อผิดพลาดของรหัส หากคุณใช้ฐานข้อมูลที่อนุญาตให้ใช้การเข้าร่วมแบบธรรมชาติ (ไม่ใช่ฉันคิดว่าคุณควรใช้มัน แต่เมื่อมีคุณสมบัติที่มีให้ใครสักคนจะใช้พวกเขา) คุณจะเข้าร่วมในสิ่งที่ผิดถ้าคุณได้รับนักพัฒนาที่ใช้

หากคุณกำลังคัดลอกตัวเชื่อมเพื่อสร้างคิวรีที่ซับซ้อนคุณสามารถลืมเปลี่ยนชื่อแทนเป็นชื่อที่คุณต้องการและเข้าร่วมไม่ถูกต้องได้อย่างง่ายดาย หากแต่ละ id ตั้งชื่อตามตารางที่อยู่คุณจะได้รับข้อผิดพลาดทางไวยากรณ์ นอกจากนี้ยังง่ายต่อการตรวจสอบถ้าแบบสอบถามเข้าร่วมที่ซับซ้อนไม่ถูกต้องถ้าชื่อ pPK และชื่อ FK ตรงกัน


+1: สิ่งเหล่านี้เป็นเหตุผลที่น่าสนใจในความเห็นของฉันในขณะที่คำตอบอื่น ๆ ที่ต่อต้านIDไม่เชื่อฉันเลย
phoog

Re: "หากคุณกำลังคัดลอกเข้าร่วมเพื่อสร้างแบบสอบถามที่ซับซ้อน" - ดังนั้นปัญหาของคุณคือคัดลอกและวาง หยุดการคัดลอกและวางและคุณจะเห็นว่าการตั้งชื่อ car.id นั้นสะดวกเพียงใด สำหรับการเข้าร่วม FK ให้ใช้ car.mfg = mfg.id, car.color = color.id, car.model = model.id - ง่ายมากและตรงกับสิ่งที่คุณจะเขียนใน LINQ
alpav

ลองเขียนอะไรสักอย่างร่วม 30 ข้อแล้วคุณจะเห็นว่าทำไมมันถึงเป็นปฏิปักษ์
HLGEM

นามแฝงเป็นเหตุผลแรกและสำคัญที่สุด - มันเป็นเรื่องที่น่าปวดหัวเมื่อทำรายงานที่ซับซ้อน การรวมธรรมชาติเป็นเพียงโบนัสหวาน ๆ มันวิเศษมากที่คำตอบอื่นไม่สนใจประเด็นนี้ ฉันคิดว่าการเพิ่มตัวอย่างบางอย่างจะทำให้ประเด็นนั้นชัดเจนขึ้นและกระโดดคำตอบนี้ให้สูงขึ้นไปยังที่ที่ควรจะเป็น
Lulu

5

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

อย่างไรก็ตามสำหรับฉันประโยชน์หลัก ๆ ที่ได้รับคือโปรแกรมเมอร์ด้านการบำรุงรักษาโดยเฉพาะผู้ที่ไม่ได้เกี่ยวข้องกับการพัฒนาดั้งเดิม หากคุณใช้ชื่อ "PersonID" สำหรับ ID ในตารางบุคคลและใช้ชื่อนั้นเป็นรหัสสำคัญต่างประเทศเป็นเรื่องปกติเล็กน้อยที่จะเขียนแบบสอบถามกับ schema เพื่อค้นหาว่าตารางใดมี PersonID โดยไม่ต้องอนุมานว่า "PersonID" เป็นชื่อที่ใช้เมื่อเป็นคีย์ต่างประเทศ โปรดจำไว้ว่าความสัมพันธ์ที่สำคัญกับต่างประเทศนั้นถูกหรือผิดนั้นไม่ได้ถูกบังคับใช้ในทุกโครงการ

มีกรณีขอบที่หนึ่งตารางอาจต้องมีสองต่างประเทศคีย์ไปยังตารางเดียวกัน แต่ในกรณีเช่นนี้ฉันจะใส่ชื่อคีย์เดิมเป็นชื่อต่อท้ายสำหรับคอลัมน์ดังนั้นการจับคู่สัญลักษณ์% PersonID สามารถค้นหาได้อย่างง่ายดาย อินสแตนซ์เหล่านั้นเช่นกัน

ใช่สิ่งนี้สามารถทำได้โดยมาตรฐานของการมี "id" และรู้ว่าจะใช้มันเป็น "tableNameID" เสมอไป แต่ที่ทั้งคู่ต้องรู้ว่าการฝึกปฏิบัตินั้นเกิดขึ้นและขึ้นอยู่กับนักพัฒนาดั้งเดิมที่จะต้องทำตาม การปฏิบัติมาตรฐานที่ใช้งานง่าย

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

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


สมมติว่าCompaniesตารางมี 2 foreign key ไปยังPersonsตาราง หนึ่งหมายถึงประธาน บริษัท อื่น ๆ แสดงถึงเหรัญญิกของ บริษัท คุณต้องการจริงๆเรียกคอลัมน์PersonID1และPersonID2? มันจะไกลมากขึ้นพรรณนาจะเรียกพวกเขาและPresidentID TreasurerIDฉันพบว่าอ่านง่ายinner join Person AS Presidents ON Company.PresidentID = Presidents.IDกว่ามากinner join Person AS Person1 ON Company.PersonID1 = Person1.PersonID
phoog

1
เลขที่ในตัวอย่างของผมก็อาจจะมีCompanyOfficerหรือCompanyPersonตารางซึ่งจะช่วยให้ความสัมพันธ์ที่หลายต่อหลายคนที่มีระหว่างCompanyและPersonข้อมูลเพิ่มเติมเกี่ยวกับธรรมชาติของความสัมพันธ์ ถ้าฉันจะใช้มันในCompanyตารางฉันจะใช้ชื่อคอลัมน์PresidentPersonIDและTreasurerPersonIDเพื่อรักษา * PersonID ส่วนของชื่อในขณะที่เพิ่ม descriptor เพิ่มเติม inner join Person as Presidents on Company.PresidentPersonID = Presidents.PersonID
มาลาคี

5

การฝึกใช้ Id เป็นช่องหลักที่สำคัญจะนำไปสู่การฝึกซ้อมที่มีการเพิ่ม id ลงในทุกตาราง ตารางจำนวนมากมีข้อมูลเฉพาะที่ระบุระเบียนโดยไม่ซ้ำกัน ใช้ That เป็นคีย์หลักและไม่ใช่ฟิลด์ id ที่คุณเพิ่มลงในแต่ละตาราง นั่นเป็นหนึ่งในรากฐานของฐานข้อมูลเชิงสัมพันธ์

และนั่นคือสาเหตุที่การใช้ id นั้นเป็นวิธีปฏิบัติที่ไม่ดี: id มักไม่ใช่ข้อมูลแค่การเพิ่มขึ้นอัตโนมัติ

พิจารณาตารางต่อไปนี้:

PK id | Countryid   | Countryname
    1 |         840 | United States
    2 |         528 | the Netherlands

มีอะไรผิดปกติกับตารางนี้คือมันช่วยให้ผู้ใช้สามารถเพิ่มอีกบรรทัด: United States, กับ countrycode 840 มันเพิ่งทำลายความสัมพันธ์เชิงสัมพันธ์ แน่นอนคุณสามารถบังคับใช้เอกลักษณ์ในแต่ละคอลัมน์หรือคุณสามารถใช้คีย์หลักที่มีอยู่แล้ว:

PK Countryid   | Countryname
           840 | United States
           528 | the Netherlands

ด้วยวิธีนี้คุณจะใช้ข้อมูลที่คุณมีเป็นคีย์หลักซึ่งเป็นหัวใจสำคัญของการออกแบบฐานข้อมูลเชิงสัมพันธ์


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

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

และเมื่อชื่อประเทศเปลี่ยนไปคุณต้องอัปเดตทั่วฐานข้อมูลทั้งหมดเพื่อแก้ไข หากคุณเพิ่งใช้คีย์ตัวแทน (เช่น ... "id") การอัปเดตจะไม่สำคัญ คีย์ธรรมชาตินั้นยอดเยี่ยม - เมื่อพวกมันไม่เปลี่ยนรูปอย่างสมบูรณ์และไม่เปลี่ยนแปลง จริงๆแล้วมีบางกรณีที่เรื่องนี้เป็นเรื่องจริง
Gerrat

@Gerrat: หากชื่อประเทศเปลี่ยนแปลงรหัสตัวเลข ISO 3166-1 จะยังคงเหมือนเดิมเฉพาะรหัส ISO 3166-1 alpha-2 และ alpha-3 เท่านั้นที่เปลี่ยน สิ่งนี้เกิดขึ้นกับพม่า / พม่าเช่น หากประเทศเปลี่ยนอาณาเขตของตน แต่ยังคงชื่อไว้รหัสรหัส ISO 3166-1 จะเปลี่ยน แต่รหัส ISO 3166-1 alpha-2 และ alpha-3 จะยังคงอยู่ สิ่งนี้เกิดขึ้นเมื่อซูดานใต้แยกจากซูดานและเอริเทรียแยกจากเอธิโอเปีย เมื่อเยอรมนีตะวันออกและตะวันตกรวมกันพวกเขาเก็บรหัส alpha-2 และ alpha-3 ของเยอรมนีตะวันตก แต่ได้รับรหัสตัวเลขใหม่ เมื่อประเทศต่างๆละลายหรือเปลี่ยนแปลงอย่างสมบูรณ์ (คิด…
Jörg W Mittag

…ผลลัพธ์ของสงครามบอลข่านของยุค 90) พวกเขาได้รับทั้งรหัสตัวเลขและอัลฟา -2 และอัลฟ่า -3 ใหม่
Jörg W Mittag

4

ฉันมักจะใช้ 'id' เป็นชื่อคอลัมน์หลักสำหรับทุกตารางเพียงเพราะเป็นหลักการของกรอบที่ฉันใช้ (Ruby on Rails, CakePHP) ดังนั้นฉันจึงไม่จำเป็นต้องแทนที่มันตลอดเวลา

นั่นจะไม่ชนะเหตุผลทางวิชาการสำหรับฉัน


2

ฉันไม่คิดว่ามันเป็นการปฏิบัติที่ไม่ดีถ้ามันถูกใช้อย่างถูกต้อง เป็นเรื่องปกติที่จะมีช่อง ID ที่เพิ่มขึ้นอัตโนมัติที่เรียกว่า "ID" ที่คุณไม่ต้องแตะและใช้ตัวระบุที่เป็นมิตรสำหรับแอปพลิเคชัน อาจเป็นเรื่องยุ่งยากในการเขียนโค้ดเช่นนี้from tableA a inner join tableB b on a.id = b.a_idแต่รหัสนั้นสามารถซ่อนอยู่ได้

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


คุณจะไม่เข้าร่วมสองตารางโดยคีย์หลักแต่ละตัวโดยเฉพาะอย่างยิ่งรหัสการเพิ่มอัตโนมัติ ตัวอย่างข้างต้นจะมาจาก tableA การรวมด้านใน tableB b ใน a.id = b.table_a_id
Bill Leeper

ใช่นั่นคือสิ่งที่ฉันหมายถึง เกือบเที่ยงและต้องการพลังงาน
Wayne Molina

2

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

หวังว่าจะไม่มีใครพัฒนาฐานข้อมูล sql โดยที่ ID เป็นคำที่สงวนไว้

CREATE TABLE CAR (ID);

ดูแลชื่อฟิลด์คีย์หลักและการเพิ่มอัตโนมัติโดย 1 เริ่มต้นด้วย 1 ทั้งหมดในแพ็คเกจตัวละคร 2 ตัวเล็ก ๆ ที่ดี โอ้และฉันจะเรียกมันว่า CARS แต่ถ้าเราจะประหยัดในการกดปุ่มและใครคิดว่าตารางที่ชื่อว่า CAR จะมีแค่อันเดียว?


1
นี้แสดงให้เห็นว่าทำไมความรู้ของทฤษฎีความสัมพันธ์อย่างเป็นทางการเป็นสิ่งที่สำคัญชื่อตารางแสดงให้เห็นถึงสิ่งที่แถวเดียวคือ ตารางCarแสดงถึงการTableที่แต่ละหมายถึงเดียวRow CarการโทรในCarsการเปลี่ยนแปลงความหมายและแสดงให้เห็นถึงการขาดความเข้าใจที่สมบูรณ์ของหลักการพื้นฐานเชิงสัมพันธ์อย่างเป็นทางการ ทางรถไฟเป็นตัวอย่างที่สำคัญของคนที่รู้มากพอที่จะเป็นอันตราย

2

คำถามนี้ถูกตีซ้ำแล้วซ้ำอีก แต่ฉันคิดว่าฉันก็จะเพิ่มความคิดเห็นของฉัน

  1. ฉันใช้รหัสเพื่อหมายความว่านั่นคือตัวระบุสำหรับแต่ละตารางดังนั้นเมื่อฉันเข้าร่วมกับตารางและฉันต้องการคีย์หลักฉันจะเข้าร่วมกับคีย์หลักโดยอัตโนมัติ

  2. ฟิลด์ id เป็น autoincrement ที่ไม่ได้ลงชื่อ (หมายความว่าฉันไม่จำเป็นต้องตั้งค่าและไม่สามารถลบได้)

  3. สำหรับคีย์ต่างประเทศฉันใช้ tablenameid (เป็นเรื่องของสไตล์อีกครั้ง) แต่คีย์หลักที่ฉันเข้าร่วมคือฟิลด์ id ของตารางดังนั้นความสอดคล้องจึงหมายความว่าฉันสามารถตรวจสอบคิวรีได้อย่างง่ายดาย

  4. id สั้นและหวานเกินไป

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


1

อีกสิ่งที่ควรพิจารณาคือหากชื่อคีย์หลักแตกต่างจากชื่อคีย์ต่างประเทศคุณจะไม่สามารถใช้เครื่องมือของบุคคลที่สามได้

ตัวอย่างเช่นคุณจะไม่สามารถโหลด schema ของคุณลงในเครื่องมืออย่าง Visio และทำให้ ERD นั้นถูกต้อง


นั่นจะเป็นความผิดของเครื่องมือของบุคคลที่สาม แบบแผนการตั้งชื่อคอลัมน์ไม่สามารถทดแทนกุญแจต่างประเทศที่เกิดขึ้นจริงได้ซึ่งเครื่องมือควรจะตรวจสอบอย่างรอบคอบ
Gerrat

1

ฉันพบว่าผู้คนที่นี่ครอบคลุมทุกแง่มุม แต่ฉันต้องการเพิ่มว่า "id" ไม่ใช่และไม่ควรอ่านในฐานะ "ตัวระบุ" ซึ่งเป็นดัชนี "มากกว่า" และแน่นอนว่ามันไม่ได้ระบุหรืออธิบายตัวตนของแถว (ฉันอาจใช้ข้อความที่ไม่ถูกต้องที่นี่โปรดแก้ไขให้ฉันถ้าฉันไม่ได้)

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

SELECT cars.color, cars.model FROM cars WHERE cars.id = <some_var>

ด้วยวิธีนี้คุณสามารถแปลเป็นภาษาอังกฤษได้ว่า "ให้สีและรุ่นของรถคันนั้นที่มีหมายเลขเป็น" และไม่ใช่แบบ "ระบุสีและรุ่นของรถคันนั้นที่ระบุว่าเป็นตัวเลข" ID ไม่ได้เป็นตัวแทนของรถ แต่อย่างใดมันเป็นเพียงดัชนีของรถยนต์ซึ่งเป็นหมายเลขซีเรียลเท่านั้นหากคุณต้องการ เช่นเดียวกับเมื่อคุณต้องการที่จะเอาองค์ประกอบที่สามจากอาร์เรย์

ดังนั้นเพื่อสรุปสิ่งที่ฉันต้องการเพิ่มคือมันเป็นเพียงเรื่องของการตั้งค่าและวิธีการอธิบายการอ่าน SQL เป็นที่นิยมที่สุด

แม้ว่าจะมีบางกรณีที่ไม่ได้ใช้งานเช่น (ตัวอย่างที่หายากกว่า) เมื่อ ID เป็นสตริงที่อธิบายได้จริง ตัวอย่างid = "RedFordMustang1970"หรือสิ่งที่คล้ายกัน ฉันหวังว่าฉันจะอธิบายเรื่องนี้อย่างน้อยก็เพื่อให้ได้ความคิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.