ไปยังโดเมนหรือไม่ไปยังโดเมน


15

มาตรฐาน SQL92 และ SQL99 กำหนดโครงสร้างDDL ไม่ใช่ทุกฐานข้อมูลที่รองรับสิ่งนี้หรือมีชื่ออื่น (SQL Server มีประเภทที่กำหนดโดยผู้ใช้เป็นต้น)CREATE DOMAIN

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

ผมอยากจะรู้ว่า:

  • ผู้คนใช้โดเมนในการออกแบบฐานข้อมูลจริง ๆ หรือไม่
  • ถ้าเป็นเช่นนั้นในระดับใด?
  • มีประโยชน์อย่างไร
  • คุณพบข้อผิดพลาดอะไรบ้าง

ฉันพยายามประเมินศักยภาพของการใช้สิ่งเหล่านี้ในการพัฒนาฐานข้อมูลในอนาคต


1
ฉันก็อยากจะรู้เรื่องนี้เหมือนกัน ... ฉันสนใจที่จะฟังสิ่งที่ผู้คนพูด
maple_shaft

คำตอบ:


2

เหมือนอย่างเคย...

มันขึ้นอยู่กับ

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

ถ้าเป็นเช่นนั้นโดเมนออกไป ถ้าไม่สนใจ

ฉันพบว่าจำเป็นต้องสร้างประเภทที่ผู้ใช้กำหนดใน SQL Server เพียงครั้งเดียวขึ้นอยู่กับการแก้ปัญหาข้างต้น ฉันจำไม่ได้ว่ามันเป็นอะไร - แต่มันช่วยให้ทำงานได้มากกว่าที่มันเป็น


5

ในฐานะผู้ใช้ SQL Server และ C # ฉันไม่ได้ใช้ประเภทที่กำหนดโดยผู้ใช้ในฐานข้อมูลเนื่องจากฉันค่อนข้างมีประสิทธิภาพมากกว่าในด้านแอปพลิเคชัน เหตุการณ์หลังจาก ORMs เช่น LINQ ไปยัง SQL และ Entity Framework การใช้ความสามารถของเซิร์ฟเวอร์ของฉันลดลงมาก

ตัวอย่างเช่นฉันใช้การรวม CLR เพื่อโหลดฟังก์ชันการแปลง DateTime บางส่วนไปยัง SQL Server เพื่อถ่ายโอนวันที่แบบเกรโกเรียนเป็นรูปแบบอื่นโดยยึดตามพลังงานโลกาภิวัตน์ของ. NET แต่ตอนนี้สิ่งต่าง ๆ และฉันจะไม่ทำอย่างนั้นอีกต่อไป ฉันเพียงแค่โหลดข้อมูลและทำการแปลงในแอปพลิเคชันเลเยอร์ของฉัน

ดังนั้นหลังจากผ่านไปเกือบ 4 ปีของการเขียนโปรแกรมและตรวจสอบทีมทั้งหมดที่ฉันสามารถนึกได้ฉันไม่พบตัวอย่างของการใช้ประเภทที่กำหนดโดยผู้ใช้ ฉันยังไม่เคยเห็นมันทำงานในบล็อก. NET จำนวนมาก

แม้ว่านี่จะไม่ได้หมายความว่าผู้ใช้ไม่ได้ใช้โดเมนฐานข้อมูลแต่อย่างน้อยก็หมายความว่าการใช้ฐานข้อมูลโดเมนนั้นไม่ใช่เรื่องปกติ


"ฉันไม่ได้ใช้ประเภทที่กำหนดโดยผู้ใช้ในฐานข้อมูลเนื่องจากฉันค่อนข้างมีประสิทธิภาพมากกว่าในด้านแอปพลิเคชัน" : ดังนั้นคุณจึงใช้ข้อ จำกัด แทน? ฉันไม่เข้าใจมันแตกต่างจากมุมมองของแอปพลิเคชันอย่างไร
Arseni Mourzenko

@MainMa ตัวอย่างเช่นฉันไม่ได้สร้างคลาสนักเรียนในชั้นฐานข้อมูล ฉันสร้างตารางนักเรียนที่มีชนิดข้อมูลดั้งเดิมทั้งหมดเช่นจำนวนเต็มและสตริงจากนั้นใช้ ORM ฉันจะจับคู่ระเบียนใด ๆ กับวัตถุในแอปพลิเคชัน
Saeed Neamati

เข้าใจ คุณถูก.
Arseni Mourzenko

3

มีคำตอบโดยละเอียดเกี่ยวกับ Stack Overflow แล้ว ฉันเห็นด้วยกับมันเป็นส่วนใหญ่ แต่ไม่ใช่ด้วยตัวอย่างที่กำหนดฉันพูด:

“ ตัวอย่างเช่นฉันกำหนด "ประเภทเพศ" (อักขระ (1), ไม่เป็นโมฆะ, ถือ "M" หรือ "F") เพื่อให้แน่ใจว่าอนุญาตเฉพาะข้อมูลที่เหมาะสมในฟิลด์เพศ "

โดยส่วนตัวแล้วฉันรู้สึกสะดวกสบายมากกว่าการตั้งค่าchar(1)ประเภทและกำหนดข้อ จำกัด ในคอลัมน์ เมื่อมีการละเมิดข้อ จำกัด ฉันรู้อย่างแน่ชัดว่าจะค้นหาสิ่งที่ฉันทำผิด นอกจากนี้ยังรู้จักกันดีกว่าประเภทที่ผู้ใช้กำหนดดังนั้นฐานข้อมูลที่ใช้ข้อ จำกัด จะง่ายต่อการเข้าใจสำหรับผู้เริ่มต้น

แน่นอนมันเป็นเพียงความเห็นส่วนตัว คนอื่นจะบอกว่าin ('M', 'F')ข้อ จำกัด ไม่ใช่การจัดทำเอกสารด้วยตนเองและอาจคลุมเครือมากสำหรับนักพัฒนารายใหม่ที่ค้นพบฐานข้อมูล

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


แล้วกระเทยล่ะ?
ไวแอตต์บาร์เน็ตต์

หรือ intersex หรือคนข้ามเพศ?
Broam

1

ฉันไม่ได้ใช้คุณสมบัตินี้ด้วยตัวเอง แต่ฉันคิดว่าคุณต้องแน่ใจว่า:

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

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

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

คุณอาจสนใจในการตรวจสอบ"อะไรคือจุดของ [SQL Server] ประเภทที่ผู้ใช้กำหนดเอง" บทความบล็อก


1
+1 สำหรับจุดที่สาม การเขียนข้อ จำกัด เดียวกันซ้ำแล้วซ้ำอีกในขณะที่ฉันทำไม่ใช่สิ่งที่ดีที่สุดที่จะทำโดยเฉพาะอย่างยิ่งเมื่อข้อ จำกัด อาจเปลี่ยนแปลงตลอดเวลาจำเป็นต้องเปลี่ยนในหลาย ๆ ที่
Arseni Mourzenko

0

เมื่อคุณพูดว่า "ไม่ใช่ฐานข้อมูลทั้งหมดที่สนับสนุนสิ่งนี้" ฉันคิดว่าวิธีที่ดีกว่าในการวางเป็นดังต่อไปนี้:

ทุกฐานข้อมูลหลักรองรับสิ่งนี้เนื่องจากรองรับทริกเกอร์ฟังก์ชันและคุณสมบัติขั้นสูงอื่น ๆ อย่างกว้างขวาง

นี่ทำให้เราสรุปได้ว่านี่เป็นส่วนหนึ่งของ 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 มันก็อาจจะเป็นบูลีนแทนก็ได้ (เว้นแต่เราต้องการเสนอตัวเลือกที่สามและสี่) แน่นอนว่าเราทุกคนรู้ว่านี่ไม่ใช่การเพิ่มประสิทธิภาพเพราะค่าใช้จ่ายของคอลัมน์ แต่มีความเป็นไปได้


ฐานข้อมูลทั้งหมดไม่รองรับคุณสมบัติเฉพาะ (DOMAINs) ใช่การใช้ทริกเกอร์ข้อ จำกัด และฟังก์ชั่นที่คุณสามารถจำลองได้ แต่นั่นไม่ได้ทำให้มันเป็นคุณสมบัติที่รองรับ
Oded

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

0

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

ในทางปฏิบัติราคาที่คุณจ่าย (วันนี้) สูงเกินไป เห็นได้ชัดว่ามีค่าใช้จ่ายในการพัฒนา แต่นอกเหนือจากที่คุณสูญเสียการสนับสนุนจาก ORM ที่หลากหลายและเครื่องมือการรายงานและเพิ่มความซับซ้อนโดยรวมของการแก้ปัญหาค่อนข้างน้อย มีนักพัฒนาไม่มากนักที่คุ้นเคยกับ UDT อย่างใกล้ชิดและฉันไม่เคยเห็น UDT ที่มีการจัดการที่ใช้นอกตัวอย่าง

หนึ่งในตัวอย่างที่ดีที่สุดของประเภทที่ทำได้ดีที่สุดในฐานะ UDT (หากยังไม่มีอยู่) จะต้องเป็นhierarchyid( ลิงก์ MSDN ) เพื่อให้มีประสิทธิภาพจะเก็บค่าไว้ในรูปแบบไบนารี (ตรงข้ามกับการใช้งานที่กำหนดเองตามปกติของ varchar) ซึ่งจะยุ่งยากในการรักษาโดยไม่ต้องใช้ฟังก์ชั่นของประเภท 10 หรือดังนั้นวิธีการที่ให้ประเภทที่ดีที่สุดให้เป็นส่วนหนึ่งของประเภทเมื่อเทียบกับฟังก์ชั่นภายนอก ฉันจะพิจารณาใช้ UDT ที่มีการจัดการที่กำหนดเองในกรณีเช่นนี้ - ซึ่งมีประโยชน์อย่างมากที่จะได้รับโดยการนำเสนอการดำเนินการที่มีประสิทธิภาพและเป็นระเบียบเป็นประเภทแยกต่างหาก


0

คำถาม / คำตอบที่ใช้งานได้จริง บริษัท ของคุณอนุญาตให้ใช้หรือไม่

บริษัท ของคุณทำงานกับ DBSQL หลายยี่ห้อที่จัดการ DDL แตกต่างกันหรือไม่

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

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

ฉันได้ทำงานกับหลายโครงการที่ User Defined Type อาจมีประโยชน์ แต่ฉันควรใช้คุณสมบัติมาตรฐานมากกว่าเนื่องจากเราต้องจัดการกับ DB หลายตัว (s)

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