SQL Server เทียบเท่ากับชนิดข้อมูล MySQL enum หรือไม่


คำตอบ:


155

มันไม่ได้ มีความหมายที่คลุมเครือ:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
ทำไมไม่ใช้ตารางที่กำหนดค่าที่ถูกต้องแล้วใช้ข้อ จำกัด foreign key แทน
Elaskanator

@Elaskanator ฉันจะบอกว่านี่เป็นคำตอบที่ถูกต้องที่สุดของ direct OP ในขณะที่ทางออกที่ดีที่สุดก็น่าจะเป็นการใช้งานตารางภายนอกของ FK +
userfuser

ขอบคุณ @Elaskanator ที่เตือนฉันถึงสิ่งที่ชัดเจน ... ทำให้ข้อมูลเป็นปกติและหยุดการทำงานของ enum
แอนดรู

88

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


13
ทางออกที่ดีกว่าจากมุมมองด้านการบำรุงรักษามากกว่าข้อ จำกัด การตรวจสอบที่แสดงด้านบน
HLGEM

21
นี่เป็นทางออกที่ดีกว่า Enums - ใน MySQL เช่นกัน
ypercubeᵀᴹ

2
@ypercube ทำไมมันจะดีกว่าสำหรับ MySQL เช่นกัน?
BenR

4
: @BenRecord มีหลายเรื่องอยู่กับ enums ของ MySQL 8 เหตุผลทำไมของ MySQL ENUM ข้อมูลประเภทเป็นความชั่วร้าย ฉันไม่เห็นด้วย 100% ว่ามันชั่วร้าย แต่คุณต้องระวังเป็นพิเศษเมื่อใช้มัน
ypercubeᵀᴹ

1
@ BenR ยังถ้าฉันจำได้อย่างถูกต้องในโหมดที่ไม่เข้มงวดกับ MySQL, enum ที่ไม่ถูกต้องสามารถแทรกเป็น NULL ทีมของฉันก่อนหน้ามีปัญหากับ MySQL enum ที่ไม่ถูกแทรกและไม่ล้มเหลวเมื่อค่าไม่ได้ระบุไว้ในรายการค่า ข้อ จำกัด foreign key ในตารางการค้นหาจะทำให้เกิดความล้มเหลว ฉันยอมรับตารางการค้นหาจะดีกว่าสำหรับ MySQL
Jim Schubert

4

ตารางการค้นหา IMHO เป็นวิธีที่จะไปด้วยความสมบูรณ์ของการอ้างอิง แต่ถ้าคุณหลีกเลี่ยง "Evil Magic Numbers" โดยทำตามตัวอย่างเช่นอันนี้: สร้าง enum จากตารางค้นหาฐานข้อมูลโดยใช้ T4

มีความสุข!


2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

ในกรณีที่ประสิทธิภาพสำคัญยังคงใช้ค่าฮาร์ด


1

พบแนวทางที่น่าสนใจนี้เมื่อฉันต้องการใช้ enums ใน SQL Server

วิธีการที่กล่าวถึงด้านล่างในลิงค์ค่อนข้างน่าสนใจเนื่องจากความต้องการฐานข้อมูลทั้งหมดของคุณสามารถทำได้ด้วย 2 โต๊ะกลาง

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
นี่คือรูปแบบของรูปแบบการต่อต้านที่รู้จักกันในชื่อ "หนึ่งตารางจริง (การค้นหา)" วิธีการที่เหมาะสมคือการมีตารางแยกสำหรับแต่ละประเภท enum และใช้คีย์ต่างประเทศ (ถ้าคุณต้องการค้นหาเลยซึ่งอาจไม่ใช่กรณีสำหรับ enums "บริสุทธิ์")
Branko Dimitrijevic

2
ความคิดเห็นในหน้าเชื่อมโยงให้การสำรองข้อมูลที่ดีสำหรับการใช้แต่ละตารางสำหรับแต่ละ "enum" มากกว่าคำตอบที่ระบุไว้นี้
skia.heliou

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