Table Naming: ขีดล่าง vs Camelcase? เนมสเปซ? เอกพจน์กับพหูพจน์?


91

ฉันได้อ่านคำถาม / คำตอบสองสามข้อใน StackOverflow เพื่อพยายามค้นหา 'ที่ดีที่สุด' หรือฉันควรจะบอกว่าต้องเป็นวิธีที่ยอมรับเพื่อตั้งชื่อตารางบนฐานข้อมูล

นักพัฒนาส่วนใหญ่มักจะตั้งชื่อตารางโดยขึ้นอยู่กับภาษาที่ต้องการฐานข้อมูล (JAVA, .NET, PHP ฯลฯ ) อย่างไรก็ตามฉันรู้สึกว่ามันไม่ถูกต้อง

วิธีที่ฉันตั้งชื่อตารางจนถึงตอนนี้คือทำสิ่งต่างๆเช่น:

doctorsMain
doctorsProfiles
doctorsPatients
patientsMain
patientsProfiles
patientsAntecedents 

สิ่งที่ฉันกังวลคือ:

  • ความชัดเจน
  • การระบุโมดูลอย่างรวดเร็วในตารางมาจาก (แพทย์ || ผู้ป่วย)
  • เข้าใจง่ายเพื่อป้องกันความสับสน

ฉันต้องการอ่านความคิดเห็นเกี่ยวกับหลักการตั้งชื่อ ขอขอบคุณ.

คำตอบ:


183

ความสม่ำเสมอมีความสำคัญมากกว่าโครงร่างที่คุณใช้


21
กล่าวอีกนัยหนึ่งคือใช่ทำได้ดีคุณได้ระบุแผนการที่สอดคล้องกันแล้ว รับกับมัน!
Phil H

3
+1 สำหรับความคิดเห็น นอกจากนี้หมายเหตุด้านข้างของรูปแบบการตั้งชื่อปัจจุบัน PascalCase จะดีกว่าโดยเฉพาะถ้าคุณไม่ใช้นามแฝงสำหรับแบบสอบถาม SQL วิธีนี้คุณสามารถใช้ camelcase กับชื่อคอลัมน์ตารางและ Pascal Case บน Table Names
MarioRicalde

3
กรณี Pascal / อูฐสำหรับชื่อตารางอาจทำให้เกิดปัญหาบางอย่าง ทุกตารางจะมีไฟล์อยู่ในระบบไฟล์และบางตารางก็ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ (เช่น OSX)
ismriv

2
@ismriv นั่นเป็นเพียงปัญหาหากคุณไม่สอดคล้องกันหากคุณมักอ้างถึงตาราง / มุมมอง / คอลัมน์ด้วยกรณีที่สอดคล้องกันเสมอคุณไม่ควรมีปัญหาใด ๆ อย่าขี้เกียจเมื่อเขียนชื่อเหล่านี้จะทำให้คุณได้รับเงินมาก ได้เปรียบในภายหลังเมื่ออ่าน การใช้ PascalCase สำหรับตารางและ camelCase สำหรับคอลัมน์ช่วยในการระบุประเภทของชื่อได้อย่างรวดเร็วและยังเลียนแบบการประชุมเชิงวัตถุทั่วไป
TWiStErRob

ฉันทั้งหมดเห็นสอดคล้องกันว่าเป็นกุญแจสำคัญ แต่นี่เป็นคำถามที่เก่าและสำหรับคนที่ใช้แพลตฟอร์มฐานข้อมูลใหม่เช่น Redshift และเกล็ดหิมะที่เริ่มต้นอย่างใดอย่างหนึ่งทุกกรณีบนหรือกรณีที่ต่ำกว่าตัวระบุฉันต้องการเพิ่มว่ามันเป็นสิ่งสำคัญมากที่จะคิดเกี่ยวกับ หลักการตั้งชื่อตั้งแต่เริ่มต้น การเลือกใช้หลักการตั้งชื่อเช่น Camel Case บนแพลตฟอร์มเหล่านี้อาจทำให้คุณปวดหัวโดยไม่จำเป็นในภายหลังเช่นคุณจะต้องใช้ตัวระบุที่ยกมาตลอดเวลาและการแก้ปัญหาชื่อวัตถุอาจให้ผลลัพธ์ที่ไม่คาดคิด
Nathan Griffiths

23

ฉันมักจะใช้ PascalCase และเอนทิตีเป็นเอกพจน์:

DoctorMain
DoctorProfile
DoctorPatient

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


3
ใช่ ... ใช่ฉันทำ เช้านี้มีหมอกนิดหน่อย กำลังทำการแก้ไข ... ขอบคุณ
Justin Niessner

3
หรือที่เรียกว่า "CapitalCase"
corsiKa

4
ฉันไม่เคยได้ยินชื่อ "CapitalCase" จากประสบการณ์ 30 ปีของฉัน ฉันเคยได้ยินชื่อ "เคสอูฐ" มากที่สุดและ "เคสปาสคาล" เพิ่งถูกนำมาใช้ ฉันมาที่นี่เพื่อดูว่าทำไมผู้คนถึงใช้เคสอูฐสำหรับ SQL ในเมื่อในอดีตส่วนใหญ่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แน่นอนฉันไม่ต้องการที่จะตกอยู่เบื้องหลังเวลา
Sinthia V

@SinthiaV ฉันไม่รู้เกี่ยวกับคนอื่น แต่ในกรณีของเราเนื่องจากเราใช้ JS ORM (น่าเสียใจ) ตัวเลือกคือ 1) ทำลายการประชุมโดยใช้ camelCase ในฐานข้อมูล 2) แบ่งการประชุมโดยใช้ snake_case ใน JS 3) แผนที่ camelCase ใน JS ถึง snake_case ใน db เราตัดสินใจโดยไม่คิดเริ่มต้นมากนักที่จะใช้ camelCase ในฐานข้อมูลและมันก็ไม่ได้แย่มากนัก แต่การอ้างถึงทุกอย่างนั้นค่อนข้างยุ่งยาก
Andy

@SinthiaV เป็นความคิดเห็นที่ไร้ประโยชน์ซึ่งอาจอยู่ในบริบทของคำถาม SO จริง PascalCase ไม่เหมือนกับ camelCase PascalCase ใช้อักษรตัวพิมพ์ใหญ่ตัวแรกของแต่ละคำ (รวมถึงตัวอักษรตัวแรกเป็นหลัก) ในขณะที่ camelCase จะใช้อักษรตัวพิมพ์ใหญ่ตามหลังตัวอักษรตัวแรกเท่านั้น อ่านเพิ่มเติม: medium.com/better-programming/…
ซอกแซก

11

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


10

การรวมส่วนใหญ่ข้างต้น:

  • อย่าพึ่งพากรณีในฐานข้อมูล
  • อย่าพิจารณากรณีหรือส่วนคั่นของชื่อ - เพียงแค่คำ
  • ใช้ตัวคั่นหรือตัวพิมพ์ใดก็ได้ที่เป็นมาตรฐานสำหรับภาษาของคุณ

จากนั้นคุณสามารถแปลชื่อ (โดยอัตโนมัติ) ระหว่างสภาพแวดล้อมได้อย่างง่ายดาย

แต่ฉันจะเพิ่มข้อพิจารณาอีกอย่าง: คุณอาจพบว่ามีปัจจัยอื่น ๆ เมื่อคุณย้ายจากคลาสในแอปไปยังตารางในฐานข้อมูลของคุณ: วัตถุฐานข้อมูลมีมุมมองทริกเกอร์ procs ที่จัดเก็บดัชนีข้อ จำกัด ฯลฯ - นั่น ยังต้องการชื่อ ตัวอย่างเช่นคุณอาจพบว่าตัวเองเข้าถึงเฉพาะตารางผ่านมุมมองที่มักจะเป็นเพียง "เลือก * จาก foo" ธรรมดา ๆ สิ่งเหล่านี้อาจถูกระบุว่าเป็นชื่อตารางที่มีเพียงคำต่อท้าย "_v" หรือคุณอาจใส่ไว้ในสคีมาอื่นก็ได้ จุดประสงค์ของเลเยอร์นามธรรมที่เรียบง่ายเช่นนี้คือสามารถขยายได้เมื่อจำเป็นเพื่อให้มีการเปลี่ยนแปลงในสภาพแวดล้อมหนึ่งเพื่อหลีกเลี่ยงไม่ให้กระทบกับอีกชั้นหนึ่ง สิ่งนี้จะไม่ทำลายคำแนะนำในการตั้งชื่อข้างต้น - มีเพียงไม่กี่สิ่งที่ควรพิจารณา


8

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


2
ใน 11g ขึ้นไปดูเหมือนว่าตัวพิมพ์จะถูกคงไว้หากชื่อตารางถูกรวมไว้ด้วยเครื่องหมายคำพูดคู่ วางสิ่งนี้ไว้ที่นี่เพื่อใช้อ้างอิงในอนาคต ฉันรู้ด้วยความมั่นใจว่า Postgres ทำเช่นนั้นเช่นกันเครื่องมือ db อื่น ๆ อาจไม่ทำเช่นนั้น
John O

8

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

/ [a-z _] [a-z0-9 _] * / เป็นรูปแบบเดียวของชื่อที่แปลระหว่างแพลตฟอร์มต่างๆได้อย่างราบรื่น ตัวพิมพ์เล็กที่เป็นตัวอักษรและตัวเลข + ขีดล่างจะทำงานอย่างสม่ำเสมอ

ตามที่กล่าวไว้ในที่อื่น ๆ ชื่อความสัมพันธ์ (ตาราง) ควรเป็นเอกพจน์: http://www.teamten.com/lawrence/programming/use-singular-nouns-for-database-table-names.html


ฉันเห็นด้วย - ขีดล่างมีปัญหาน้อยที่สุดในการเปรียบเทียบกับ Pascal หรือ Camel Casing โดยเฉพาะอย่างยิ่งเมื่อคุณตั้งชื่อไปที่โมเดล dto และส่วนหน้าในตอนท้าย
Saulius

6

ฉันมักจะเห็นด้วยกับคนที่พูดว่ามันขึ้นอยู่กับรูปแบบของภาษาที่คุณใช้ (เช่น PascalCase สำหรับ C # และ snake_case สำหรับ Ruby)

ห้ามอูฐเคสเด็ดขาด


2
Ada: Pascal_Case_With_Underscores
uetoyo

7
สิ่งนี้ไม่สมเหตุสมผลเมื่อคุณต้องการเข้าถึงตารางเดียวกันโดยใช้ภาษาสองภาษาที่แตกต่างกันซึ่งมีหลักการตั้งชื่อที่แตกต่างกัน
Daniel W.

5

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


1
เห็นด้วยอย่างยิ่ง!!! โดยเฉพาะอย่างยิ่งกับ MySQL เมื่อคุณทำงานบนหน้าต่างทุกอย่างกลายเป็นจากไปcamelCase camelcaseดังนั้นการมีกรณีงูจะดีกว่ามาก นอกจากนี้Modern software however supports any kind of naming schemeคุณยังไม่มีการรับประกันใด ๆ ที่ yop จะเขียนโค้ดสำหรับรุ่นล่าสุดที่อ่อนนุ่ม โดยเฉพาะอย่างยิ่งสำหรับฐานข้อมูล - การอัปเดตเวอร์ชันไม่ใช่เรื่องสำคัญเมื่อคุณคิดถึงต้นทุนการถดถอย
Cherry

2

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

  1. ใช้เครื่องหมายขีดล่าง
  2. ใช้เคสอูฐพร้อมเครื่องหมายคำพูด

เหตุผลก็คือฐานข้อมูลบางส่วนจะแปลงอักขระทั้งหมดเป็นตัวพิมพ์ใหญ่และบางส่วนเป็นตัวพิมพ์เล็ก ดังนั้นถ้าคุณมีmyTableมันจะกลายเป็นMYTABLEหรือmytableเมื่อคุณจะทำงานกับ DB


1

น่าเสียดายที่ไม่มีคำตอบที่ "ดีที่สุด" สำหรับคำถามนี้ ตามที่ @David กล่าวไว้ความสอดคล้องมีความสำคัญมากกว่าหลักการตั้งชื่อ


1

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


1

หลักการตั้งชื่อมีอยู่ในขอบเขตของภาษาและภาษาที่แตกต่างกันมีหลักการตั้งชื่อที่แตกต่างกัน

SQL ไม่คำนึงถึงขนาดตัวพิมพ์โดยค่าเริ่มต้น ดังนั้น snake_case จึงเป็นแบบแผนที่ใช้กันอย่างแพร่หลาย SQL ยังรองรับตัวระบุที่ใช้ตัวคั่น ดังนั้นกรณีผสมในตัวเลือกเช่น camelCase (Java โดยที่ fields == คอลัมน์) หรือ PascalCase (C # โดยที่ตาราง == คลาสและคอลัมน์ == ฟิลด์) หากเอ็นจิ้น DB ของคุณไม่รองรับมาตรฐาน SQL นั่นคือปัญหา คุณสามารถตัดสินใจที่จะอยู่กับสิ่งนั้นหรือเลือกเครื่องยนต์อื่น (และทำไม C # ถึงต้องแตกต่างกันจึงเป็นจุดที่ทำให้แย่ลงสำหรับพวกเราที่เขียนโค้ดทั้งสองอย่าง)

หากคุณตั้งใจจะใช้เพียงภาษาเดียวในบริการและแอปพลิเคชันของคุณให้ใช้รูปแบบของภาษานั้นในทุกเลเยอร์ มิฉะนั้นให้ใช้รูปแบบที่ใช้กันอย่างแพร่หลายของภาษาในโดเมนที่ใช้ภาษานั้น

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