INT หรือ CHAR สำหรับเขตข้อมูลประเภท


19

การออกแบบที่ดีที่สุดสำหรับตารางคืออะไรTypeข้อมูลที่เป็นintหรือchar(1)? กล่าวอีกนัยหนึ่งให้คีมานี้:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

มันมีประสิทธิภาพมากกว่า (ฉลาดในการทำงาน) VehTypeเพื่อที่จะเป็นintหรือchar(1)? สมมติว่าคุณมีรถยนต์ห้าประเภทคุณควรใช้ค่าที่เพิ่มขึ้น 0 -> 4 หรือตัวอักษรสำหรับประเภท (พูด; 'v', 's', 'c', 't', 'm')?

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

ฉันสังเกตเห็นว่าsys.objectsมุมมองแคตตาล็อกใช้อักขระสำหรับtypeฟิลด์ มีเหตุผลสำหรับสิ่งนั้นหรือไม่? ฉันเพิ่งจะคว้าที่อากาศที่นี่และมันเป็นสิ่งที่ฉันสะดวกสบายด้วยหรือไม่

คำตอบ:


20

โดยทั่วไปคุณจะใช้ tinyint ซึ่งมีขนาด 1 ไบต์เช่นกัน

  • ถ่าน (1) จะช้าลงเล็กน้อยเนื่องจากการเปรียบเทียบการเปรียบเทียบการใช้

  • ความสับสน: S: SUV หรือSaloon หรือ Sedanหรือ Sports คืออะไร?

  • ใช้ตัวอักษร จำกัด คุณในขณะที่คุณเพิ่มประเภทอื่น ๆ ดูจุดสุดท้าย

  • ทุกระบบที่ฉันเห็นมีลูกค้ามากกว่าหนึ่งรายเช่นการรายงาน ตรรกะของการเปลี่ยน V, S เป็น "Van", "SUV" ฯลฯ จะต้องทำซ้ำ การใช้ตารางการค้นหาหมายความว่าเป็นการรวมที่ง่าย

  • ความสามารถในการขยาย: เพิ่มอีกหนึ่งประเภท ("F" สำหรับ " Flying car ") คุณสามารถแถวหนึ่งไปยังตารางการค้นหาหรือเปลี่ยนรหัสและข้อ จำกัด มากมาย และรหัสลูกค้าของคุณด้วยเพราะต้องรู้ว่า V, S, F ฯลฯ คืออะไร

  • การบำรุงรักษา: ลอจิกอยู่ใน 3 แห่ง: ข้อ จำกัด ของฐานข้อมูล, รหัสฐานข้อมูลและรหัสลูกค้า ด้วยการค้นหาและคีย์ต่างประเทศสามารถอยู่ในที่เดียว

ในด้านบวกของการใช้ตัวอักษรเดียว ... เอ้อไม่เห็นเลย

หมายเหตุ: มีคำถาม MySQL เกี่ยวกับ Enumsอยู่ คำแนะนำคือการใช้ตารางการค้นหาที่นั่นเช่นกัน


2
จุดที่ดี มันทำให้ฉันสงสัยว่าทำไมคนอื่นถึงใช้ถ่าน (1) (เช่น sys.objects)
Thomas Stringer

2
sys.objects มีมรดกที่กลับไปที่ Sybase และ SQL Server รุ่นแรกen.wikipedia.org/wiki/Microsoft_SQL_Server#Genesisถ้าคุณดูวัตถุระบบคุณจะเห็นรหัสไม่ใช่รหัสทั้งหมด: แต่น้อยกว่านั้นใน DMVs ใหม่ สำหรับชาวบ้านอื่น ๆ ยกเว้น MS? คิดว่า RDBMS ไม่ใช่ OO / Enums และควรใช้การค้นหา
gbn

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

1
@onedaywhen: มันสร้างความแตกต่างได้ไม่ว่าคุณจะมองประเภทต่าง ๆ เป็นข้อมูลหรือเป็นชุดค่าคงที่ที่ไม่เปลี่ยนแปลง หากคุณใช้ตารางประเภทคุณสามารถเพิ่มประเภทอื่นลงในตารางได้โดยไม่จำเป็นต้องเปลี่ยนกฎธุรกิจในฐานข้อมูลและในแอปพลิเคชัน
Guffa

1
@ MichaelKjörling: ถูกต้องถ้าเป็นเพียงกุญแจ แต่ OP ตั้งใจที่จะหมายถึงบางอย่างเช่น "v" หรือ "s" หมายเหตุเราไม่ได้เกี่ยวกับการอธิบายตนเองและการใช้คีย์ธรรมชาติอย่างสมบูรณ์เช่นรหัสสกุลเงิน (EUR, USD, GBP, CHF เป็นต้น)
gbn

3

เพียงแค่เป็นส่วนเติมเต็มให้ดีคำตอบ GBN ของ

บางทีคุณอาจสร้างบางสิ่งเช่นนั้น:

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

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


คุณหมายถึงอนุญาตให้ใช้nullรหัสหรือไม่
Jack Douglas

ใช่รหัสเป็นทางเลือกเพื่ออนุญาตให้แสดงประเภทของยานพาหนะที่ยังไม่ได้ประมวลผล
Fabricio Araujo

ทำไมคนชอบที่จะยังคงลบความคิดเห็น? ค่อนข้างน่ารำคาญ
Fabricio Araujo

@FabricioAraujo - หากความคิดเห็นนั้นล้าสมัย (เช่น "ฉันจะแก้ไขมันในคำตอบของฉัน" และจากนั้นคุณทำเช่นนั้นจริง ๆ ) จากนั้นก็เป็นการดีที่จะทำความสะอาดความคิดเห็นที่ไม่ได้ใช้อีกต่อไป
Nick Chammas

1
ฉันขอแนะนำให้เพิ่มประเภท "Unclassified" ลงในตารางประเภทของคุณและสร้างค่าเริ่มต้นของฟิลด์ VehTypeId ของคุณที่ไม่ได้จัดประเภทค่าแทนที่จะอนุญาตให้มีค่า Null ในเขตข้อมูล Foreign Key โดยทั่วไปแล้วการปฏิบัติที่ไม่ดีในการทำให้ "null" มีความหมายทางธุรกิจที่ถูกต้อง
Michael Blackburn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.