หลักการตั้งชื่อคีย์หลัก / คีย์ต่างประเทศ [ปิด]


98

ในกลุ่มนักพัฒนาของเรามีการถกเถียงกันอย่างดุเดือดเกี่ยวกับหลักการตั้งชื่อสำหรับคีย์หลักและคีย์ต่างประเทศ โดยพื้นฐานแล้วมีโรงเรียนความคิดสองแห่งในกลุ่มของเรา:

1:

Primary Table (Employee)   
Primary Key is called ID

Foreign table (Event)  
Foreign key is called EmployeeID

หรือ

2:

Primary Table (Employee)  
Primary Key is called EmployeeID

Foreign table (Event)  
Foreign key is called EmployeeID

ฉันไม่ต้องการให้ชื่อของตารางซ้ำกันในคอลัมน์ใด ๆ (ดังนั้นฉันชอบตัวเลือกที่ 1 ด้านบน) ตามแนวคิดแล้วมันสอดคล้องกับแนวทางปฏิบัติที่แนะนำในภาษาอื่น ๆ โดยที่คุณไม่ได้ใช้ชื่อของวัตถุในชื่อคุณสมบัติ ฉันคิดว่าการตั้งชื่อ Foreign Key EmployeeID(หรือEmployee_IDอาจจะดีกว่า) เป็นการบอกผู้อ่านว่ามันคือIDคอลัมน์ของEmployeeTable

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

นอกจากนี้ฉันคิดว่ามันซ้ำซ้อนที่จะมีชื่อตารางในชื่อคอลัมน์เพราะถ้าคุณคิดว่าตารางเป็นเอนทิตีและคอลัมน์เป็นคุณสมบัติหรือแอตทริบิวต์ของเอนทิตีนั้นคุณจะคิดว่ามันเป็นแอตทริบิวต์ ID ของEmployeeไม่ใช่EmployeeIDแอตทริบิวต์ของพนักงาน ผมไม่ได้ไปสอบถามเพื่อนร่วมงานของฉันสิ่งที่เขาPersonAgeหรือPersonGenderเป็น ฉันถามเขาว่าอายุเท่าไหร่

อย่างที่ฉันพูดมันเป็นการถกเถียงกันอย่างดุเดือดและเราจะดำเนินการต่อไปเรื่อย ๆ ฉันสนใจที่จะได้รับมุมมองใหม่ ๆ


1
คำถามซ้ำกันstackoverflow.com/questions/208580/…
Mike Henke

1
ฉันอ่านคำถามที่คล้ายกันมากกว่า 10 คำถามและในที่สุดก็พบคำตอบ 3 อันดับแรกที่ดีที่นี่: stackoverflow.com/a/465146/781695
ผู้ใช้

หมายเหตุด้านข้าง: ตัวเลือก 2 จะช่วยให้คุณสามารถ 'เข้าร่วมตามธรรมชาติ' ได้ Heck ทำไมไม่ทำในตัวเลือกที่ 1 โดยเพิ่ม 'Employee.ID เป็น EmployeeID' แต่วิธีปฏิบัติที่ดีกว่าดูเหมือนจะเป็น 'เข้าร่วม' โดยใช้ 'ON Employee.ID = Event.EmployeeID'
ลีโอ

ในทั้งสองสถานการณ์คุณจะต้องใช้นามแฝง (หรือ 'table_name.column_name') ในหนึ่งคิวหรือมากกว่านั้นเนื่องจากคุณเป็นทั้งสองกรณีที่ต้องใช้ชื่อคอลัมน์ซ้ำ
Please_Dont_Bully_Me_SO_Lords

คำตอบ:


54

มันไม่สำคัญจริงๆ ฉันไม่เคยเจอระบบที่มีความแตกต่างอย่างแท้จริงระหว่างตัวเลือก 1 และตัวเลือก 2

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

เลือกหนึ่งข้อและบอกให้พวกเขามุ่งเน้นไปที่ปัญหาที่ส่งผลกระทบต่อโค้ดของคุณ

แก้ไข: หากคุณต้องการสนุกให้พวกเขาระบุความยาวว่าเหตุใดวิธีการของพวกเขาจึงดีกว่าสำหรับการอ้างอิงตารางแบบวนซ้ำ


28
+1 สำหรับสามัญสำนึก ... มีเรื่องสำคัญกว่าที่จะโต้แย้ง .. ดังนั้นทำในแบบของฉัน (ตัวเลือกที่ 2)
Charles Bretana

5
และสำหรับการอ้างอิง DRI เมื่อมี FK มากกว่าหนึ่งตัวที่อ้างถึง PK เดียวกันด้วยตนเองคุณต้องละเมิด "มาตรฐาน" ทั้งสองคอลัมน์เนื่องจากไม่สามารถตั้งชื่อคอลัมน์ FK ให้เหมือนกันได้ ... เช่น EmployeeTable กับ EmployeeId PK, SupervisorId FK, MentorId Fk, PartnerId FK ฯลฯ ...
Charles Bretana

77

หากทั้งสองคอลัมน์มีชื่อเดียวกันในทั้งสองตาราง (การประชุม # 2) คุณสามารถใช้ไวยากรณ์ USING ใน SQL เพื่อบันทึกการพิมพ์และสัญญาณรบกวนบางส่วน:

SELECT name, address, amount
  FROM employees JOIN payroll USING (employee_id)

ข้อโต้แย้งอีกประการหนึ่งที่สนับสนุนการประชุม # 2 คือเป็นวิธีการออกแบบโมเดลเชิงสัมพันธ์

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


4
ไวยากรณ์และความหมายของ SQL ให้เบาะแสที่ดีเกี่ยวกับวิธีการใช้งาน เช่นการใช้ไวยากรณ์หมายถึงคอลัมน์ที่มีโดเมนเดียวกันควรมีชื่อเดียวกัน NULL = NULL -> NULL หมายถึง NULL "ไม่ทราบ" มากกว่า "ไม่เกี่ยวข้อง" และ ON UPDATE CASCADE หมายความว่าคีย์ต้องไม่ซ้ำกันเท่านั้นไม่เปลี่ยนรูป
Steven Huwig

7
ยิ่งไปกว่านั้นมันช่วยให้สิ่งนี้: SELECT name, address, amount FROM employees NATURAL JOIN payroll.
onedaywhen

6
ฉันจะไม่ใช้การรวมตามธรรมชาติในโค้ดที่ปรับใช้แล้วเพราะมันเป็น brittler ในกรณีของการเพิ่มสคีมา แต่สำหรับการสืบค้นแบบโต้ตอบนั้นยอดเยี่ยมมาก
Steven Huwig

3
+1 แต่มีข้อยกเว้นเสมอ ตัวอย่างเช่นหากคุณมีคอลัมน์สองคอลัมน์ในบัญชีเงินเดือนที่มีทั้งคีย์ต่างประเทศให้กับพนักงาน (รายการหนึ่งอ้างอิงถึงบุคคลที่ได้รับค่าจ้างส่วนที่สองคือผู้จัดการที่มีอำนาจด้านงบประมาณเป็นต้น) แต่เราไม่สามารถตั้งชื่อคีย์ต่างประเทศทั้งสองemployee_idได้
Bill Karwin

1
คำหลัก "ใช้" เป็นคำหลักเฉพาะ MySql ไม่ทำงานใน T-SQL - น่าเสียดาย
birdus

12

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

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


4
+1 เมื่อต้องคิดออกรวมกับชื่อคอลัมน์ที่ไม่ตรงกัน
Raj More

4
"ระบบเก่า" แฮนดิแคป 8 ตัวอักษรชื่อยาวที่เจ็บกว่านี้เยอะ ฉันเต็มใจที่จะออกไปข้างนอกและคาดเดาว่าการมี PK ชื่อ ID ไม่ใช่สาเหตุหลักของฝันร้ายในระบบเก่าที่คุณกำลังเผชิญอยู่ นอกจากนี้ "มันถูกดูดในระบบเก่า" ก็ใช้ waaaaay บ่อยเกินไปในการพัฒนาซอฟต์แวร์โดยเฉพาะฐานข้อมูล ฉันมักจะเห็นผู้คนให้เหตุผลเกี่ยวกับการปฏิบัติ A ใด ๆ ตามวิธีการทำงานของพวกเขาในประสบการณ์ของพวกเขาในระบบ DB ที่เผยแพร่เมื่อ 10 ปีก่อน
Russell Steen

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

2
ดังนั้นผู้คนเมื่อ 20 ปีก่อนควรมีการใช้ชื่อคอลัมน์ที่สมเหตุสมผลในปัจจุบันแม้ว่าจะมีเพียง 8 ตัวอักษร? รูปแบบการจัดเก็บข้อมูลมีการเปลี่ยนแปลงอย่างมากในช่วง 20 ปีที่ผ่านมาและจะเปลี่ยนอีกครั้งในอีก 20 ปีข้างหน้าไม่มีวิธีใดที่จะแสดงให้เห็นว่าความชอบของคุณจะยืนหยัดทดสอบเวลาได้ดีกว่าวิธีอื่น ๆ ที่ระบุไว้ "ชื่อคอลัมน์" อาจเป็น "เรื่องไร้สาระ" ตามเวลาที่ผู้คนสนทนากันในรอบ 20 ปีเนื่องจากความสามารถในการจัดเก็บและจัดการข้อมูลของเราดีขึ้น ตารางเป็นโครงสร้างของมนุษย์ที่แสดงถึงความสัมพันธ์ของข้อมูลที่ไม่สมบูรณ์ ...
รัสเซลสตีน

1
ขอบคุณสำหรับการตอบสนองทางปัญญาที่มีเหตุผลอย่างดี
Russell Steen

4

คุณได้พิจารณาสิ่งต่อไปนี้แล้วหรือยัง?

Primary Table (Employee)   
Primary Key is PK_Employee

Foreign table (Event)  
Foreign key is called FK_Employee

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

1
ขอบคุณที่ชี้ให้เห็น ฉันยังสนใจในเหตุผลที่คุณไม่ใช้รูปแบบนี้ และฉันค่อนข้างแน่ใจว่าจะมีเหตุผลที่ดี ...
Wouter

นี่เป็นวิธีที่ดีที่สุดเนื่องจากคุณจะไม่ต้องใช้table_name.column_nameในการสืบค้นและไม่ต้องใช้นามแฝงสำหรับชื่อคอลัมน์หากไม่มีชื่อซ้ำ ...
Please_Dont_Bully_Me_SO_Lords

1
นี่อาจถือได้ว่าเป็นรูปแบบหนึ่งของสัญกรณ์ฮังการี ดังนั้นพิจารณาข้อโต้แย้งที่เห็นด้วยและต่อต้านสิ่งนั้น
Fred

3

การประชุมทั้งสองไม่ได้ผลในทุกกรณีเหตุใดจึงต้องมี ใช้สามัญสำนึก ...

เช่นสำหรับตารางอ้างอิงตัวเองเมื่อมีคอลัมน์ FK มากกว่าหนึ่งคอลัมน์ที่อ้างอิงด้วยตนเอง PK ของตารางเดียวกันคุณต้องละเมิด "มาตรฐาน" ทั้งสองเนื่องจากคอลัมน์ FK สองคอลัมน์ไม่สามารถตั้งชื่อเหมือนกันได้ ... เช่น , EmployeeTable กับ EmployeeId PK, SupervisorId FK, MentorId Fk, PartnerId FK, ...


1
+1 สำหรับคำตอบวัตถุประสงค์ทางเทคนิคที่แท้จริง
DVK

คำตอบที่ดีใช้ได้ แต่ข้อโต้แย้งของคำตอบของ Dems ไม่ตรงประเด็น
JYelton

3

ฉันยอมรับว่ามีให้เลือกน้อยมาก สำหรับฉันสิ่งที่สำคัญกว่ามากเกี่ยวกับมาตรฐานอย่างใดอย่างหนึ่งคือส่วน "มาตรฐาน"

หากผู้คนเริ่ม 'ทำอะไรของตัวเอง' พวกเขาก็ควรจะถูกเนรเทศ IMHO :)


3
+1 สำหรับการตระหนักว่าความสม่ำเสมอสำคัญกว่าการ "ถูกต้อง" (ในกรณีนี้)
Russell Steen

-1 สำหรับการพยายามใช้ "ความสอดคล้องที่โง่เขลา" สุภาษิตจีนโบราณกล่าวว่า "ความสม่ำเสมอที่โง่เขลาคือความคิดที่เรียบง่าย"
Charles Bretana

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

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

1
คุณสามารถโต้แย้งว่า "ID" มีความสอดคล้องกันมากขึ้นเพราะทันทีที่คุณแนะนำ "carID" ภาษาอังกฤษในตาราง "รถยนต์" หรือ "รถ"? "sheepID" ในตาราง "แกะ" หรือ "แกะ" - สิ่งต่างๆเริ่มไม่สอดคล้องกัน หากคุณยึดติดกับ "ID" และชื่อตารางเอกพจน์ - สิ่งนี้ไม่เพียง แต่จะสอดคล้องกันเท่านั้น แต่ยังเล่นได้ดีกับ ORM จำนวนมาก / ต้องการการกำหนดค่าน้อยลงด้วย (เช่น Dapper Contrib)
niico

2

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


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

ใช่. ฉันเดาว่ามันเป็นความชอบส่วนตัวและ / หรืออะไรก็ตามที่คุณเคยเห็น
Jarett Millard

2

หากคุณกำลังดูรหัสแอปพลิเคชันไม่ใช่แค่การสืบค้นฐานข้อมูลบางสิ่งดูเหมือนจะชัดเจนสำหรับฉัน:

  1. คำจำกัดความของตารางมักจะแมปโดยตรงกับคลาสที่อธิบายอ็อบเจ็กต์หนึ่งดังนั้นจึงควรเป็นเอกพจน์ ในการอธิบายคอลเล็กชันของอ็อบเจ็กต์ฉันมักจะต่อท้าย "Array" หรือ "List" หรือ "Collection" ไว้ในชื่อเอกพจน์เนื่องจากการใช้พหูพจน์จะบ่งบอกได้ชัดเจนว่าไม่ใช่แค่คอลเล็กชันเท่านั้น แต่ยังรวมถึงคอลเล็กชันประเภทใดด้วย มันคือ. ในมุมมองนั้นฉันเห็นชื่อตารางไม่ใช่ชื่อของคอลเล็กชัน แต่เป็นชื่อของประเภทของวัตถุที่เป็นคอลเล็กชัน DBA ที่ไม่เขียนโค้ดแอปพลิเคชันอาจพลาดจุดนี้

  2. ข้อมูลที่ฉันจัดการมักใช้ "ID" เพื่อวัตถุประสงค์ในการระบุตัวตนที่ไม่ใช่คีย์ เพื่อขจัดความสับสนระหว่างคีย์ "ID" และ "ID" ที่ไม่ใช่คีย์สำหรับชื่อคีย์หลักเราใช้ "คีย์" (นั่นคืออะไรใช่หรือไม่) ที่นำหน้าด้วยชื่อตารางหรือตัวย่อของ ชื่อตาราง คำนำหน้านี้ (และฉันขอสงวนไว้สำหรับคีย์หลักเท่านั้น) ทำให้ชื่อคีย์ไม่ซ้ำกันซึ่งมีความสำคัญอย่างยิ่งเนื่องจากเราใช้ชื่อตัวแปรที่เหมือนกับชื่อคอลัมน์ฐานข้อมูลและคลาสส่วนใหญ่มีพาเรนต์ซึ่งระบุโดยชื่อของ คีย์หลัก นอกจากนี้จำเป็นต้องตรวจสอบให้แน่ใจว่าไม่ใช่คีย์เวิร์ดที่สงวนไว้ซึ่ง "คีย์" เพียงอย่างเดียวคือ เพื่ออำนวยความสะดวกในการรักษาชื่อตัวแปรหลักให้สอดคล้องกันและจัดเตรียมโปรแกรมที่ทำการรวมแบบธรรมชาติ คีย์ต่างประเทศมีชื่อเดียวกับที่ใช้ในตารางซึ่งเป็นคีย์หลัก ฉันมีโปรแกรมที่พบมากกว่าหนึ่งครั้งซึ่งทำงานได้ดีกว่านี้มากโดยใช้การรวมแบบธรรมชาติ ในประเด็นสุดท้ายนี้ฉันยอมรับว่ามีปัญหาเกี่ยวกับตารางอ้างอิงตัวเองซึ่งฉันเคยใช้ ในกรณีนี้ฉันจะยกเว้นกฎการตั้งชื่อคีย์ต่างประเทศ ตัวอย่างเช่นฉันจะใช้ ManagerKey เป็นคีย์ต่างประเทศในตารางพนักงานเพื่อชี้ไปที่ระเบียนอื่นในตารางนั้น


ตัวแมปเชิงสัมพันธ์เชิงวัตถุ (ORM) จำนวนมากเช่น Entity Framework ช่วยให้คุณสามารถแมปตารางกับคลาสที่มีชื่ออื่นได้ ซึ่งทำให้คุณมีคลาสชื่อ "User" และตารางชื่อ "Users"
Fred

2

ฉันชอบการประชุม # 2 - ในการค้นคว้าหัวข้อนี้และค้นหาคำถามนี้ก่อนโพสต์ของฉันเองฉันพบปัญหาที่:

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

SELECT table1.id AS parent_id, table2.id AS child_id

แม้ว่าจะใช้การประชุม # 2 หมายถึงผมจะยังคงมีบางคอลัมน์ในผลที่มีชื่อเดียวกันกับตอนนี้ผมสามารถระบุที่ ID ฉันจำเป็น (แม่หรือเด็ก) และเป็นสตีเว่น Huwig ปัญหาที่USINGสิ่งที่ช่วยลดความยุ่งยากคำสั่งเพิ่มเติม


2
SELECT *เป็นข้อห้ามสำหรับข้อความค้นหาการผลิต (ส่วนใหญ่) ดังนั้นจึงไม่มีเหตุผลมากนักในการเลือกมาตรฐานการตั้งชื่อ
P Daddy

1
ไม่เห็นด้วย: ให้ลิงค์เหตุผลว่าทำไมถึงเป็นเช่นนั้น? ฉันไม่ชอบความคิดที่จะต้องรักษาชื่อ 80 คอลัมน์ในแบบสอบถามของฉัน
JYelton

ไม่พบลิงก์ในขณะนี้ (ยากสำหรับ Google สำหรับ "*") แต่ฉันจะสรุปประเด็นพื้นฐาน: (1) การเปลี่ยนแปลงตารางอาจส่งผลเสียต่อแอปพลิเคชันของคุณ (2) อาจเป็น ไม่ดีต่อประสิทธิภาพและ (3) การระบุอย่างชัดเจนว่าข้อมูลใดที่คุณต้องการจริงสามารถทำให้โค้ดของคุณเข้าใจง่ายขึ้น จุดเหล่านี้สามารถขยายได้และมีข้อยกเว้น (ตามที่ฉันพูดถึง) แต่นั่นไม่เหมาะสมที่นี่ หากคุณโพสต์คำถามนี้เป็นคำถามใหม่ฉัน (และคนอื่น ๆ ) ยินดีที่จะอธิบายเพิ่มเติม
P Daddy

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

1
ฉันไม่แน่ใจว่าSELECT *เป็นข้อห้ามสำหรับคำถามการผลิตส่วนใหญ่ หากเพิ่มความเร็วในการพัฒนาอย่างมีนัยสำคัญและทำให้โค้ดของคุณสั้นลงและอ่านได้มากขึ้น - ช่วยให้คุณสามารถมุ่งเน้นไปที่เรื่องที่สำคัญได้มากขึ้น - ทำไมSELECT *ล่ะ? มากน้อยขึ้นอยู่กับสถานการณ์ของแต่ละสถานการณ์และเป็นการแลกเปลี่ยนระหว่างหลายปัจจัย กฎข้อเดียวแทบจะไม่เหมาะกับทุกสิ่ง
niico

2

ฉันเคยใช้userIdเป็น PK บนโต๊ะเดียวและuserIdบนโต๊ะอื่นเป็น FK ฉันคิดอย่างจริงจังเกี่ยวกับการใช้userIdPKและuserIdFKเป็นชื่อเพื่อระบุชื่อจากอีกชื่อหนึ่ง มันจะช่วยให้ฉันระบุ PK และ FK ได้อย่างรวดเร็วเมื่อดูตารางและดูเหมือนว่ามันจะล้างโค้ดเมื่อใช้ PHP / SQL เพื่อเข้าถึงข้อมูลทำให้เข้าใจง่ายขึ้น โดยเฉพาะอย่างยิ่งเมื่อมีคนอื่นดูรหัสของฉัน


1

ฉันใช้หลักการประชุม # 2 ตอนนี้ฉันกำลังทำงานกับโมเดลข้อมูลเดิมโดยที่ฉันไม่รู้ว่าอะไรย่อมาจากตารางที่กำหนด อันตรายในการเป็น verbose อยู่ที่ไหน?


1

วิธีการตั้งชื่อ Foreign Key

role_id

โดยที่บทบาทคือบทบาทที่เอนทิตีอ้างอิงมีความสัมพันธ์กับตารางในมือ สิ่งนี้ช่วยแก้ปัญหาการอ้างอิงซ้ำและหลาย fks ในตารางเดียวกัน

ในหลาย ๆ กรณีจะเหมือนกับชื่อตารางที่อ้างอิง ในกรณีนี้จะกลายเป็นเหมือนกับหนึ่งในข้อเสนอของคุณ

ไม่ว่าในกรณีใดการโต้แย้งที่ยาวนานเป็นความคิดที่ไม่ดี


0

"ที่ใดใน" พนักงาน INNER JOIN สั่งซื้อ ON order.employee_id = workers.id "จำเป็นต้องมีคุณสมบัติเพิ่มเติมหรือไม่"

ไม่จำเป็นต้องมีคุณสมบัติเพิ่มเติมเพราะคุณสมบัติที่ฉันพูดถึงมีอยู่แล้ว

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

อธิษฐานบอกฉันทีถ้าคอลัมน์นั้นชื่อ 'ID' แล้วการ "อ้างอิง [sic] ไปที่ตาราง" นั้นทำได้อย่างไรเว้นแต่ว่าจะมีคุณสมบัติตรงตามการอ้างอิงคอลัมน์ ID นี้ตามที่ฉันพูด

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