เมื่อคุณพูดว่า "ไม่ใช่ฐานข้อมูลทั้งหมดที่สนับสนุนสิ่งนี้" ฉันคิดว่าวิธีที่ดีกว่าในการวางเป็นดังต่อไปนี้:
ทุกฐานข้อมูลหลักรองรับสิ่งนี้เนื่องจากรองรับทริกเกอร์ฟังก์ชันและคุณสมบัติขั้นสูงอื่น ๆ อย่างกว้างขวาง
นี่ทำให้เราสรุปได้ว่านี่เป็นส่วนหนึ่งของ SQL ขั้นสูงและเหมาะสมในบางจุด
Do people actually use domains in their database designs?
ความเป็นไปได้ที่น้อยลงเนื่องจากความครอบคลุมที่จำเป็น (การพิจารณาตัวดำเนินการดัชนี ฯลฯ )
If so to what extent?
หาก จำกัด ประเภทที่มีอยู่รวมกับตรรกะที่กำหนดเพิ่มเติมเล็กน้อย (เช่นการตรวจสอบและอื่น ๆ ) สามารถทำเล่ห์กลทำไมถึงได้ไกลขนาดนั้น?
How useful are they?
มากทั้ง ลองพิจารณาหนึ่งในสองวินาทีของ DBMS ที่ไม่ดีเช่น MySQL ซึ่งฉันเลือกตัวอย่างนี้ด้วยเหตุผลหนึ่งข้อ: มันขาดการสนับสนุนที่ดีสำหรับประเภท inet (ที่อยู่ IP)
ตอนนี้คุณต้องการเขียนแอปพลิเคชั่นที่มุ่งเน้นไปที่ข้อมูล IP เช่นช่วงและทั้งหมดและคุณติดอยู่กับประเภทเริ่มต้นและฟังก์ชั่นที่ จำกัด คุณจะสามารถเขียนฟังก์ชั่นเพิ่มเติมและตัวดำเนินการเพิ่มเติมได้ ตัวอย่าง) หรือเขียนคิวรีที่ซับซ้อนมากขึ้นสำหรับทุกฟังก์ชันที่คุณต้องการ
นี่เป็นกรณีที่คุณสามารถปรับเวลาที่ใช้ในการกำหนดฟังก์ชั่นของคุณเองได้อย่างง่ายดาย (inet >> inet ใน PostgreSQL: ช่วงที่อยู่ในตัวดำเนินการช่วง)
ณ จุดนี้คุณได้พิสูจน์การขยายประเภทข้อมูลสนับสนุนแล้วมีเพียงขั้นตอนเดียวในการกำหนดประเภทข้อมูลใหม่
ตอนนี้กลับไปที่ PostgreSQL ซึ่งรองรับประเภทที่ดีจริง ๆ แต่ไม่มี int ที่ไม่ได้ลงนามซึ่งคุณต้องการเพราะคุณกังวลเกี่ยวกับการจัดเก็บ / ประสิทธิภาพ (ใครจะรู้ ... ) คุณจะต้องเพิ่มมันและ ตัวดำเนินการ - แม้ว่าแน่นอนว่าสิ่งนี้ส่วนใหญ่ได้มาจากตัวดำเนินการ int ที่มีอยู่
What pitfalls have you encountered?
ฉันไม่ได้เล่นอย่างนั้นจนถึงตอนนี้ฉันยังไม่มีโปรเจ็กต์ที่ต้องใช้และให้เหตุผลสำหรับเวลาที่กำหนด
ปัญหาที่ใหญ่ที่สุดที่ฉันสามารถเห็นได้คือการสร้างล้อใหม่แนะนำข้อบกพร่องในเลเยอร์ "ปลอดภัย" (db) การสนับสนุนประเภทที่ไม่สมบูรณ์ซึ่งคุณจะรู้ได้เพียงเดือนต่อมาเมื่อ CONCAT (cast * AS varchar) ล้มเหลวเพราะคุณ ไม่ได้กำหนด cast (newtype เป็น varchar) เป็นต้น
มีคำตอบที่พูดถึง "ผิดปกติ" ฯลฯ แน่นอนว่าสิ่งเหล่านี้ควรเป็นเรื่องแปลก (มิฉะนั้นมันหมายถึง dbms ขาดประเภทที่สำคัญมาก) แต่ในทางกลับกันเราควรจำไว้ว่า (ดี) db นั้นเป็นไปตามมาตรฐานกรด ( ไม่เหมือนแอปพลิเคชัน) และสิ่งที่เกี่ยวข้องกับความสอดคล้องนั้นจะถูกเก็บไว้ที่ดีกว่า
มีหลายกรณีที่มีการจัดการตรรกะทางธุรกิจในเลเยอร์ซอฟต์แวร์และสามารถทำได้ใน SQL ซึ่งมันปลอดภัยกว่า ผู้พัฒนาแอพมักจะรู้สึกสะดวกสบายมากขึ้นในแอพพลิเคชั่นเลเยอร์และมักจะหลีกเลี่ยงวิธีการแก้ปัญหาที่ดีกว่าใน SQL ซึ่งไม่ควรพิจารณาว่าเป็นการปฏิบัติที่ดี
UDT สามารถเป็นทางออกที่ดีสำหรับการเพิ่มประสิทธิภาพได้เป็นตัวอย่างที่ดีในคำตอบอื่นเกี่ยวกับประเภท m / f โดยใช้ char (1) ถ้ามันเป็น UDT มันก็อาจจะเป็นบูลีนแทนก็ได้ (เว้นแต่เราต้องการเสนอตัวเลือกที่สามและสี่) แน่นอนว่าเราทุกคนรู้ว่านี่ไม่ใช่การเพิ่มประสิทธิภาพเพราะค่าใช้จ่ายของคอลัมน์ แต่มีความเป็นไปได้