ที่อยู่อีเมลไม่ซ้ำกันหรือคีย์หลัก?


11

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

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


3
จะเกิดอะไรขึ้นเมื่อผู้ใช้เปลี่ยนที่อยู่อีเมลของเขา - เช่นพวกเขาจะเปลี่ยนงาน
151019

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

คำตอบ:


7

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

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

ข้อ จำกัด ที่ไม่ซ้ำกันสามารถใช้แบบเดียวกับคีย์หลักได้ พิจารณา:

create table A ( x ... not null
               , y ... not null
               , z ... not null
               ,     unique (x)
               ,     primary key (y,z) );

create table B ( x ...
               ,   ...
               ,     foreign key (x) references A (x) );

create table C ( y ...
               , z ...
               ,   ...
               ,     foreign key (y, z) references A (y, z) );  

B อ้างอิงถึงข้อ จำกัด ที่ไม่ซ้ำกันและ C อ้างอิงถึงข้อ จำกัด ของคีย์หลัก

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

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

ในกรณีของคุณฉันอาจจะเลือกรหัสผู้สมัครอื่นเป็นคีย์หลักและประกาศอีเมลให้ไม่เป็นโมฆะและไม่ซ้ำกัน


1
ใน SQL Server คุณสามารถอ้างอิงดัชนีเฉพาะเป็น FK
Martin Smith

1
ฉันไม่มีสิทธิ์เข้าถึง sql ดังนั้นฉันจึงไม่สามารถตรวจสอบตัวเองได้มันสร้างข้อ จำกัด เฉพาะเมื่อคุณสร้างดัชนีที่ไม่ซ้ำกันหรือไม่
Lennart

1
ไม่ข้อ จำกัด ที่ไม่ซ้ำกันนั้นได้รับการปฏิบัติแตกต่างกันเล็กน้อยและมีข้อมูลเมตาเพิ่มเติมและข้อ จำกัด เพิ่มเติมบางอย่างเมื่อเทียบกับดัชนีที่ไม่ซ้ำกัน แต่ SQL Server อนุญาตให้ใช้ใน FK ได้
Martin Smith

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

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

6

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

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


1
นั่นไม่เป็นความจริงเกี่ยวกับเซิร์ฟเวอร์ SQL คุณสามารถสร้างดัชนีโดยใช้whereคำสั่งที่อนุญาตให้คุณยกเว้นNULLค่าจากดัชนี
Kirk Woll

1
คำสั่งSQL Server allows a single NULL valueยังคงเป็นจริง มันไม่ได้บอกว่าไม่มีทางที่จะได้รับหลายNULLค่า ฉันคิดว่าคำตอบพยายามทำให้คำตอบนั้นง่ายและไม่อธิบายรายละเอียดเพิ่มเติม (เช่นดัชนีที่ถูกกรอง)
แบรนดอน

1
ใช่ฉันสามารถทำให้ดัชนีทั้งหมดของกระต่ายกรองลง แต่คำถามธรรมดา ๆ มักต้องการคำตอบง่ายๆ หากไม่มีแพลตฟอร์มฐานข้อมูลและเวอร์ชันฉันจะรักษาคำตอบทั่วไป
mrdenny

2

มีดัชนีที่ไม่ซ้ำกันใน EmailAddress

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

ตามที่ระบุไว้ในคำตอบอื่น ๆ สำหรับ SQL Server คุณต้องสร้างคอลัมน์ที่ไม่อนุญาตให้มีค่า Null ก่อนสร้างดัชนีที่ไม่ซ้ำกัน

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