ใช้ที่อยู่อีเมลเป็นรหัสหลักหรือไม่


234

ที่อยู่อีเมลเป็นตัวเลือกที่ไม่ถูกต้องสำหรับข้อมูลหลักเมื่อเปรียบเทียบกับตัวเลขที่เพิ่มขึ้นอัตโนมัติหรือไม่

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

เป็นเหตุผลที่ถูกต้องหรือไม่ที่จะไม่ใช้อีเมลเป็นคีย์หลัก?

PostgreSQLเราใช้


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

7
หากคุณต้องการให้ฐานข้อมูลของคุณบังคับใช้ที่อยู่อีเมลที่ไม่ซ้ำกันให้สร้างคอลัมน์ที่มีดัชนีที่ไม่ซ้ำกัน แต่อย่าใช้เป็นคีย์หลัก
James Westgate

104
@robert เกิดอะไรขึ้นถ้ามีคนต้องการเปลี่ยนที่อยู่อีเมลของเขา? คุณจะเปลี่ยนกุญแจต่างประเทศทั้งหมดด้วยหรือไม่
systempuntoout

3
@onedaywhen - แทบจะไม่แตกต่างกัน แต่คีย์หลักจะถูกรวมกลุ่มโดยค่าเริ่มต้นในขณะที่ดัชนีที่ไม่ซ้ำกันจะไม่เป็น คุณจะยังคงต้องการกำหนดคีย์หลักซึ่งจะเป็นคีย์การค้นหาเรกคอร์ดเดียวที่เป็นค่าเริ่มต้นดัชนีที่ไม่ซ้ำกันจะบังคับเฉพาะความเป็นเอกลักษณ์ของคอลัมน์เหนือดัชนีปกติ
James Westgate

3
@ James Westgate: FYI ไม่มีเรื่องเช่นการจัดกลุ่มอัตโนมัติใน PostgreSQL มีการใช้คีย์หลักในดิสก์เหมือนกับ UNIQUE INDEX ที่ทุกฟิลด์ไม่เป็นโมฆะ
Matthew Wood

คำตอบ:


283

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

หากคุณเก็บข้อมูลเกี่ยวกับผู้ใช้ในหลาย ๆ ตารางคีย์ต่างประเทศในตารางผู้ใช้จะเป็นที่อยู่อีเมล นั่นหมายความว่าคุณเก็บที่อยู่อีเมลหลายครั้ง


11
@Sererd: ปัญหาไม่ใช่ว่าที่อยู่อีเมลถูกเก็บไว้หลายครั้งแม้ว่าจะไม่มีประสิทธิภาพแน่นอน แต่ใครจะห่วงเรื่องพื้นที่ฮาร์ดดิสก์ในวันนี้ ธุรกิจส่วนใหญ่ไม่มี google-scale ซึ่งจะเป็นเรื่องสำคัญ ปัญหาคือที่อยู่อีเมลไม่สามารถเปลี่ยนแปลงได้ในภายหลังเนื่องจากเป็นทั้งรหัสหลัก & อ้างอิงเป็นรหัสต่างประเทศ
Stefan Steiger

@StefanSteiger ใครพูดอะไรเกี่ยวกับพื้นที่ฮาร์ดดิสก์ สิ่งที่คุณจัดเก็บจะใช้พื้นที่ใน RAM
Jonathan Allen

ในกรณีที่มีสิ่งมหัศจรรย์อย่างที่ฉันทำกุญแจ GUID จะเทียบเท่ากับรหัสอีเมลที่ฉันคิด
tofutim

178

ฉันจะชี้ให้เห็นว่าอีเมลเป็นตัวเลือกที่ไม่ดีในการสร้างฟิลด์ที่ไม่เหมือนใครมีผู้คนและธุรกิจขนาดเล็กที่ใช้ที่อยู่อีเมลร่วมกัน และเช่นเดียวกับหมายเลขโทรศัพท์อีเมลสามารถใช้ซ้ำได้Jsmith@somecompany.com สามารถเป็นของ John Smith ได้หนึ่งปีและ Julia Smith อีกสองปีต่อมา

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


47
+1 สำหรับการพูดถึงปัญหาการปรับปรุงแบบเรียงซ้อน นั่นเป็นเหตุผลที่เพื่อน ๆ ให้เพื่อนใช้คีย์ตัวแทนเท่านั้น ;-)
sleske

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

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

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

14
(ต่อ) เช่นเดียวกันหากคุณกำลังสร้างระบบที่เกี่ยวข้องกับการสื่อสารทางอีเมลเป็นส่วนใหญ่ - อาจเป็นระบบการส่งข้อความหรือระบบการส่งต่อการแจ้งเตือน - เป็นไปได้ว่าตามคำจำกัดความที่อยู่อีเมลจะระบุผู้ใช้โดยไม่ซ้ำกัน หากมีหลายคนแบ่งปันที่อยู่อีเมลนั้นนั่นไม่เกี่ยวข้อง พวกเขาเป็นปลายทางข้อความเดียวดังนั้นพวกเขาเป็นผู้ใช้คนเดียว "ผู้ใช้" และ "ลูกค้า" ไม่จำเป็นต้องเป็นคำพ้องความหมายสำหรับ "มนุษย์แต่ละคน"
Jay

99

คีย์หลักควรไม่ซ้ำกันและคงที่

ที่อยู่อีเมลเปลี่ยนไปตามฤดูกาล มีประโยชน์เป็นคีย์รองสำหรับการค้นหา แต่เป็นทางเลือกที่แย่สำหรับคีย์หลัก


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

5
@onedaywhen: ใช่! มิฉะนั้นเหตุใด SQL จึงสนับสนุนการปรับปรุงแบบเรียงซ้อน
Bill Karwin

18
หากคุณมีทางเลือกให้เลือกปุ่มคงที่ / ไม่เปลี่ยนรูป ทำงานน้อยลงสำหรับคุณ เพียงเพราะ SQL รองรับการอัพเดทแบบเรียงซ้อนไม่ได้หมายความว่าเป็นความคิดที่ดีเสมอ!
Steven A. Lowe

7
@Vincent Malgrat: "การปรับปรุงเรียงซ้อน ... brakes db normalization" - มีหลายคนที่เข้าใจผิดเกี่ยวกับแนวความคิดของคุณ!
พุธที่

5
@ Vincent Malgrat: ขอบคุณสำหรับการยืนยันว่าคุณเข้าใจผิดเกี่ยวกับแนวความคิดในการทำให้เป็นมาตรฐาน "คุณไม่ควรมีข้อมูลซ้ำหลายแถวซ้ำกัน" - คุณตั้งใจจะพูดว่า "ข้อมูล" จริงๆหรือไม่! คีย์ผสมมักจะเกี่ยวข้องกับค่าซ้ำหลายแถว สำหรับคีย์ต่างประเทศค่าจะถูกอ้างอิงมากกว่า "ซ้ำ" ซึ่งเป็นความแตกต่างใหญ่ โดเมนคอลัมน์เดียวที่มีสองค่า (เช่น 'ใช่' และ 'ไม่') จะมีค่าเดียวกันในหลายแถวในตารางอ้างอิงหากมีสามแถวขึ้นไป นี่เป็นสิ่งพื้นฐานจริงๆ!
เมื่อ

64

ข้อเสียของการใช้ที่อยู่อีเมลเป็นคีย์หลัก:

  1. ช้าลงเมื่อเข้าร่วม

  2. บันทึกอื่น ๆ ที่มีคีย์ต่างประเทศที่โพสต์ในขณะนี้จะมีค่ามากกว่าใช้พื้นที่ดิสก์มากขึ้น (เนื่องจากราคาของพื้นที่ดิสก์ในวันนี้อาจเป็นปัญหาเล็กน้อยยกเว้นในกรณีที่เรคคอร์ดใช้เวลาในการอ่านนานขึ้นดูที่ # 1)

  3. ที่อยู่อีเมลสามารถเปลี่ยนแปลงได้ซึ่งบังคับให้บันทึกทั้งหมดที่ใช้สิ่งนี้เป็นรหัสต่างประเทศที่จะได้รับการปรับปรุง เนื่องจากที่อยู่อีเมลไม่ได้เปลี่ยนแปลงทุกอย่างบ่อยครั้งปัญหาด้านประสิทธิภาพอาจไม่ดีพอ ปัญหาที่ใหญ่กว่าคือคุณต้องแน่ใจว่าได้ระบุไว้ ถ้าคุณต้องเขียนโค้ดมันจะใช้งานได้มากกว่าและมีความเป็นไปได้ของบั๊ก หากเอ็นจิ้นฐานข้อมูลของคุณรองรับ "on cascade update" นั่นเป็นปัญหาเล็กน้อย

ข้อดีของการใช้ที่อยู่อีเมลเป็นคีย์หลัก:

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

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

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

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


@ Conrad: ถึงแม้ว่าเขาจะชี้ให้เห็นว่ามันไม่ใช่ PITA ถ้าคุณมีเอ็นจิ้นที่รองรับ ON CASCADE UPDATE มันไม่ใช่ปัญหาที่จุดรหัสฉลาด; ปัญหาที่แท้จริงเพียงอย่างเดียวคือการอัพเดตที่กว้างขวางและที่สำคัญคือความกว้าง ที่อยู่อีเมลอาจจะเยอะไปหน่อย แต่ CASCADE UPDATE สำหรับรหัสประเทศ PK ที่มี 2 ตัวอักษรไม่ใช่เรื่องใหญ่
Matthew Wood

5
@ Matthew IMHO ยังคงเป็น PITA ตัวอย่างเช่นสมมติว่าเมื่อคุณออกแบบตารางประเทศของคุณมีเพียงสองตารางที่อ้างอิงไม่ใหญ่ แต่เมื่อเวลาผ่านไปมันจะกลายเป็น 20 ตารางแต่ละตารางที่มีระเบียนนับแสน บางคนมีการอ้างอิงบางคนไม่มี นี่ทำให้ตรรกะการเขียนเดี่ยวจบลงเป็นหมื่นการเขียนและมันไม่ได้ทำให้มันลงในตารางทั้งหมดเพราะมีคนลืมการอ้างอิงเมื่อมีการเพิ่มตาราง นี่คือสิ่งที่แน่นอนเกิดขึ้นกับฉันในตารางรหัสประเทศ 2 ถ่านฉันเด็กคุณไม่ได้
Conrad Frix

@Wood & Conrad: กรณีที่แย่ที่สุดคือเมื่อไม่มีการรองรับฐานข้อมูลในตัว จากนั้นคุณต้องเขียนโค้ดสำหรับทุกตารางที่มีการอ้างอิงที่โพสต์และนี่เป็นเพียงความเจ็บปวดและประตูสำหรับข้อบกพร่องที่จะลื่นเข้ามาด้วย cascades คุณต้องจำไว้ว่าให้เพิ่มหนึ่งประโยคในแต่ละตารางไม่ใช่เช่นนั้น เรื่องใหญ่
Jay

2
ข้อได้เปรียบ 1 และ 3 เป็นการปรับให้เหมาะสมก่อนกำหนดข้อได้เปรียบ 2 เป็นประโยชน์เล็กน้อยและเอาชนะได้อย่างสมบูรณ์โดยเครื่องมือสืบค้นที่เหมาะสม
Ash

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

12

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

... และฉันยังไม่ได้เริ่มพูดถึงการพิจารณาเกี่ยวกับประสิทธิภาพ


การเปลี่ยนที่อยู่อีเมลทำให้มีการซ้ำซ้อนอย่างไร นอกเสียจากผู้ใช้ A เปลี่ยนที่อยู่อีเมลของเขาจากนั้นผู้ใช้ B เปลี่ยนอีเมลของเขาให้เหมือนกับค่าเก่าของผู้ใช้ A และการอัปเดตของคุณจะไม่ดำเนินการตามลำดับ เป็นไปได้จากระยะไกลฉันเดา
Jay

2
การอ้างอิงคีย์ foreign ตามนิยามมีค่าของคีย์หลักของแถวที่อ้างถึง ใส่ที่แตกต่างกันมันซ้ำค่าของคีย์หลัก (ดังนั้นการทำซ้ำไม่ได้เกิดจากการเปลี่ยนค่า แต่การเปลี่ยนแปลงนั้นยากขึ้นเนื่องจากการทำซ้ำนี้และข้อ จำกัด บังคับใช้)
meriton

5
+1 สำหรับบรรทัด "สมมติว่าผู้ให้บริการอีเมลบางรายเลิกกิจการ"
Reddy

นี่ไม่ใช่ปัญหา. มีการต่อเรียงกุญแจต่างประเทศเพื่อแก้ไขปัญหานี้ หากผู้ใช้เปลี่ยนอีเมลการเปลี่ยนแปลงจะเรียงซ้อนกับตารางทั้งหมดโดยใช้เป็นรหัสต่างประเทศ
Rafa

1
@rafa ฉันขอรับประกันว่าหากคุณใช้การอัปเดตแบบเรียงซ้อนและผู้ให้บริการทั้งหมดไปจากธุรกิจหรือเปลี่ยนชื่อ (Yahoo.com กลายเป็น HooYa.com) ฐานข้อมูลของคุณจะถูกล็อคไว้กับผู้ใช้ทุกคนเป็นเวลาหลายชั่วโมง ผ่านระบบ มันเป็นปัญหาที่ถูกต้องมาก (และสาเหตุที่เป็นความคิดที่ไม่ดีที่จะใช้การปรับปรุงแบบเรียงซ้อนหากคุณมีข้อมูลจำนวนมากและกุญแจมีแนวโน้มที่จะเปลี่ยนแปลง)
HLGEM

12

ฉันไม่ทราบว่าอาจเป็นปัญหาในการตั้งค่าของคุณหรือไม่ แต่ขึ้นอยู่กับ RDBMS ค่าของคอลัมน์อาจคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ PostgreSQL docs พูดว่า:„ หากคุณประกาศคอลัมน์เป็น UNIQUE หรือคีย์หลักดัชนีที่สร้างขึ้นโดยปริยายจะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ " กล่าวอีกนัยหนึ่งถ้าคุณยอมรับการป้อนข้อมูลของผู้ใช้สำหรับการค้นหาในตารางที่มีอีเมลเป็นคีย์หลักและผู้ใช้ให้ "John@Doe.com" คุณจะไม่พบ“ john@doe.com”


7
น่าจะกล่าวถึงในการเชื่อมต่อนี้ที่ John@Doe.com และ john@Doe.com อาจเป็นกล่องจดหมายเดียวกันหรืออาจเป็นกล่องจดหมายที่แตกต่างกันและคุณไม่มีทางบอกได้ - ไม่มีอะไรในสเป็คที่จะบอกว่าส่วนท้องถิ่นเป็นกรณี - รู้สึกไว
telent

นี่เป็นปัญหาทั่วไปที่มีการบังคับใช้ที่อยู่อีเมลที่ไม่ซ้ำมากกว่าที่ควรจะใช้เป็นคีย์หลัก - ปัญหาเดียวกันคือมีวิธีใดวิธีหนึ่ง +1 เพราะมันยังคงเป็นจุดที่มีประโยชน์มาก

11

ดูเหมือนว่าไม่มีใครพูดถึงปัญหาที่เป็นไปได้ว่าที่อยู่อีเมลอาจถูกพิจารณาว่าเป็นส่วนตัว หากที่อยู่อีเมลเป็นคีย์หลัก URL ของหน้าโปรไฟล์มักจะมีลักษณะคล้าย..../Users/my@email.comกัน ถ้าคุณไม่ต้องการเปิดเผยที่อยู่อีเมลของผู้ใช้ คุณจะต้องไปหาวิธีอื่นในการระบุผู้ใช้อาจจะโดยค่าจำนวนเต็มไม่ซ้ำกันที่จะทำให้ URL ..../Users/1ที่ชอบ จากนั้นคุณจะจบลงด้วยค่าจำนวนเต็มที่ไม่ซ้ำกันหลังจากทั้งหมด


9

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

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

systempuntoout ถาม

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

นั่นคือสิ่งที่ลดหลั่นกันมา

อีกเหตุผลที่ใช้คีย์ตัวแทนตัวเลขเป็นคีย์หลักเกี่ยวข้องกับการทำงานของการจัดทำดัชนีในแพลตฟอร์มของคุณ ยกตัวอย่างเช่นใน InnoDB ของ MySQL ดัชนีทั้งหมดในตารางจะมีคีย์หลักไว้ล่วงหน้าดังนั้นคุณต้องการให้ PK มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ (สำหรับความเร็วและขนาด) นอกจากนี้ยังเกี่ยวข้องกับสิ่งนี้ InnoDB เร็วขึ้นเมื่อเก็บคีย์หลักตามลำดับและสตริงจะไม่ช่วย

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


5

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


1
คิดว่าฉันต้องการชี้ให้เห็นว่าตอนนี้เรามีน้ำตกนี้ไม่เป็นปัญหา
malhal

4

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

แบบนี้:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);

8
ทำไม "ดีกว่า"? เหตุผลหรือแหล่งที่มา?
Sjoerd

20
คุณอธิบายรายละเอียดเกี่ยวกับเรื่องนั้นได้ไหม?
Sjoerd

3

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


3

ฉันไม่คุ้นเคยกับ postgres มากเกินไป คีย์หลักเป็นหัวข้อใหญ่ ฉันเคยเห็นคำถามและคำตอบที่ยอดเยี่ยมบนไซต์นี้ (stackoverflow.com)

ฉันคิดว่าคุณอาจมีประสิทธิภาพที่ดีขึ้นด้วยการมีคีย์หลักตัวเลขและใช้ UNIQUE INDEX ในคอลัมน์อีเมล อีเมลมักจะมีความยาวแตกต่างกันและอาจไม่เหมาะสำหรับดัชนีคีย์หลัก

บางคนอ่านที่นี่และที่นี่


3

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


2

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

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

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

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


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

ฉันไม่เชื่อว่า "การโต้แย้ง" ของคุณ - ในชีวิตจริงมักจะมีสถานการณ์ที่ข้อมูลสำคัญบางอย่าง (เช่นหมายเลขโทรศัพท์) จะไม่สามารถใช้ได้ทันที หากเขตข้อมูลดังกล่าวถูกทำเครื่องหมายว่าไม่เป็นโมฆะในฐานข้อมูลผู้ใช้จะต้องสร้างมลพิษด้วยฟิลด์จำลอง (เช่น 123) แทนที่จะปล่อยว่างไว้ มันจะเป็นจริงมากขึ้นเพื่อให้แอปพลิเคชันจัดการกับข้อ จำกัด (และในกรณีนี้แอปสามารถตั้งค่าสถานะฟิลด์ว่างเป็นรายการการกระทำ)
jrharshath

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

1
Be Wolves: ฉันรู้จักผู้หญิงคนหนึ่งที่ไม่มีหมายเลขโทรศัพท์ของตัวเอง ตอนนี้คุณทำอะไร
David Thornley

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

2

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


2
หากคุณไม่สนใจอะไรเกี่ยวกับประสิทธิภาพเพียงเล็กน้อยให้ใช้ GUID ไม่ใช่ # 1 ถ้าคุณกำลังสร้างระบบที่จะต้องปรับขนาด
มิคาห์


3
กล่าวในแฟชั่น Microsoft-Kool-Aid-drink อย่างแท้จริง!
Gary Chambers

2

ฉันรู้ว่านี่เป็นรายการเล็ก ๆ น้อย ๆ แต่ฉันต้องการเพิ่มว่าผู้คนละทิ้งบัญชีอีเมลและผู้ให้บริการกู้คืนที่อยู่ที่อนุญาตให้บุคคลอื่นใช้งานได้

@HLGEM ชี้ให้เห็นว่า "Jsmith@somecompany.com สามารถเป็นของ John Smith ได้หนึ่งปีและ Julia Smith อีกสองปีต่อมา" ในกรณีนี้หาก John Smith ต้องการบริการของคุณคุณต้องปฏิเสธที่จะใช้ที่อยู่อีเมลของเขาหรือลบบันทึกทั้งหมดที่เกี่ยวข้องกับ Julia Smith

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

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


2

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

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


1

คุณสามารถเพิ่มประสิทธิภาพได้โดยใช้คีย์หลักจำนวนเต็ม


1

คุณควรใช้คีย์หลักจำนวนเต็ม หากคุณต้องการให้คอลัมน์อีเมลไม่ซ้ำกันทำไมคุณไม่ตั้งค่าเฉพาะดัชนีในคอลัมน์นั้น


1

หากคุณมีค่าที่ไม่ใช่ int เป็นคีย์หลักการแทรกและดึงข้อมูลจะช้ามากในข้อมูลขนาดใหญ่


1
ไม่แทรกจะช้าลงเพราะคุณต้องการดัชนีที่ไม่ซ้ำกันสองรายการ : อันหนึ่งในคีย์หลักที่สร้างขึ้นและอีกอันหนึ่งที่อยู่อีเมล
a_horse_with_no_name

1

คีย์หลักควรเลือกแอตทริบิวต์คงที่ เนื่องจากที่อยู่อีเมลไม่คงที่และสามารถใช้งานร่วมกันโดยผู้สมัครหลายคนดังนั้นจึงไม่ควรใช้ที่อยู่อีเมลเหล่านี้เป็นคีย์หลัก ยิ่งไปกว่านั้นที่อยู่อีเมลเป็นสตริงที่มีความยาวแน่นอนซึ่งอาจมากกว่า id ที่ไม่ซ้ำกันที่เราต้องการใช้ [len (email_address)> len (unique_id)] ​​ดังนั้นมันจะต้องใช้พื้นที่มากขึ้นและแย่ที่สุดพวกเขาจะถูกเก็บไว้หลายครั้ง . และส่งผลให้ประสิทธิภาพลดลง


0

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


0

หากเป็นเรื่องของการกำหนดให้อีเมลไม่ซ้ำใครคุณสามารถสร้างดัชนีที่ไม่ซ้ำกับคอลัมน์นั้นได้


0

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


0

อย่าใช้ที่อยู่อีเมลเป็นคีย์หลักเก็บอีเมลที่ไม่ซ้ำกัน แต่อย่าใช้มันเป็นคีย์หลักใช้รหัสผู้ใช้หรือชื่อผู้ใช้เป็นคีย์หลัก

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