Đến miền hoặc không miền


15

Các tiêu chuẩn SQL92 và SQL99 xác định các cấu trúc DDL . Không phải tất cả các cơ sở dữ liệu đều hỗ trợ điều này hoặc có một tên khác cho nó ( ví dụ: Máy chủ SQL có các loại do người dùng xác định ).CREATE DOMAIN

Chúng cho phép một người xác định loại dữ liệu bị ràng buộc sẽ được sử dụng trong cơ sở dữ liệu của họ, để đơn giản hóa và thực thi các quy tắc liên quan đến các giá trị được phép. Kiểu dữ liệu như vậy có thể được sử dụng trong khai báo cột, trong đầu vào và đầu ra cho các thủ tục và hàm được lưu trữ, v.v ...

Tôi muốn biết:

  • Có phải mọi người thực sự sử dụng các tên miền trong thiết kế cơ sở dữ liệu của họ?
  • Nếu như vậy, đến mức độ nào?
  • Chúng hữu ích như thế nào?
  • Những cạm bẫy bạn đã gặp phải?

Tôi đang cố gắng khẳng định khả năng sử dụng chúng trong việc phát triển cơ sở dữ liệu trong tương lai.


1
Tôi cũng muốn biết điều này ... Tôi rất thích nghe những gì mọi người nói.
maple_shaft

Câu trả lời:


2

Như thường lệ...

Nó phụ thuộc

Bạn có một thực thể miền được sử dụng ở nhiều nơi hỗ trợ về mặt nguyên bản sẽ đòi hỏi nỗ lực đáng kể và / hoặc các ràng buộc và hành vi dư thừa không?

Nếu vậy, tên miền đi. Nếu không, đừng bận tâm.

Tôi đã thấy cần phải tạo một loại do người dùng xác định trong SQL Server chính xác một lần, dựa trên các heuristic ở trên. Tôi thậm chí không nhớ nó là gì nữa - nhưng nó đã tiết kiệm được nhiều công việc hơn nó gây ra.


5

Là người dùng của SQL Server và C #, tôi chưa sử dụng Loại xác định người dùng trong cơ sở dữ liệu, vì tôi khá mạnh hơn về phía ứng dụng. Sự kiện sau các ORM như LINQ to SQL và Entity Framework, việc sử dụng các khả năng máy chủ của tôi đã giảm đi rất nhiều.

Ví dụ: tôi đang sử dụng tích hợp CLR để tải một số hàm chuyển đổi DateTime sang SQL Server để chuyển thời gian ngày của Gregorian sang các định dạng khác, dựa trên sức mạnh Toàn cầu hóa của .NET. Nhưng bây giờ, mọi thứ đã khác, và tôi không làm điều đó nữa. Tôi chỉ cần tải dữ liệu và thực hiện chuyển đổi, ngay trong lớp ứng dụng của mình.

Vì vậy, sau gần 4 năm lập trình và kiểm tra tất cả các đội mà tôi có thể nghĩ ra, tôi đã không tìm thấy mẫu nào sử dụng Loại Xác định Người dùng. Tôi cũng chưa thấy nó hoạt động trong nhiều blog .NET.

Mặc dù điều này không có nghĩa là mọi người không sử dụng Miền cơ sở dữ liệu , nhưng điều đó chắc chắn có nghĩa là ít nhất sử dụng Miền cơ sở dữ liệu không phổ biến.


"Tôi chưa sử dụng Loại xác định người dùng trong cơ sở dữ liệu, vì tôi khá mạnh hơn về phía ứng dụng" : vậy bạn có sử dụng các ràng buộc không? Tôi không hiểu, nó khác với quan điểm ứng dụng như thế nào?
Arseni Mourzenko

@MainMa, ví dụ, tôi không tạo lớp Sinh viên trong lớp cơ sở dữ liệu. Tôi chỉ cần tạo một bảng sinh viên với tất cả các kiểu dữ liệu nguyên thủy, như số nguyên và chuỗi, sau đó sử dụng ORM, tôi ánh xạ bất kỳ bản ghi nào vào một đối tượng trong ứng dụng.
Saeed Neamati

Hiểu. Bạn đúng.
Arseni Mourzenko

3

Đã có câu trả lời chi tiết về Stack Overflow. Tôi hầu hết đồng ý với nó, nhưng không phải với ví dụ đã cho, tôi trích dẫn:

Ví dụ, tôi định nghĩa "Giới tính" (char (1), không thể rỗng, giữ "M" hoặc "F") để đảm bảo rằng chỉ cho phép dữ liệu phù hợp trong trường Giới tính.

Cá nhân, tôi cảm thấy thoải mái hơn khi cài đặt char(1)loại và xác định một ràng buộc trên cột. Khi các ràng buộc bị vi phạm, tôi biết chính xác nơi tìm kiếm để tìm những gì tôi đã làm sai. Nó cũng được biết đến nhiều hơn các loại do người dùng xác định, vì vậy cơ sở dữ liệu chỉ sử dụng các ràng buộc sẽ dễ hiểu hơn cho người mới bắt đầu.

Tất nhiên, chỉ là ý kiến ​​cá nhân. Những người khác sẽ nói rằng một in ('M', 'F')ràng buộc không phải là tài liệu tự và có thể rất mơ hồ đối với một nhà phát triển mới phát hiện ra cơ sở dữ liệu.

IMO, sử dụng các loại do người dùng xác định cho các loại phức tạp hơn và các ràng buộc cho một cái gì đó cơ bản. Ngoài ra, khi bạn không thể dễ dàng tìm thấy một tên rõ ràng cho một loại, có khả năng một ràng buộc sẽ phù hợp hơn.


Còn lưỡng tính thì sao?
Wyatt Barnett

Hay liên giới tính? Hay người ngoại tình?
Broam

1

Tôi chưa sử dụng tính năng này cho mình nhưng tôi đoán bạn cần chắc chắn rằng:

  1. Nếu cơ sở dữ liệu của bạn được sử dụng bởi một hệ thống duy nhất, có thể không nên sử dụng tính năng này và thêm logic kiểm tra trong lớp doanh nghiệp của bạn hoặc tương đương. Điều đó sẽ giúp bạn linh hoạt hơn trong việc xác thực (nói bằng cách sử dụng các biểu thức chính quy) và sẽ cho phép đóng gói tất cả logic xác thực ở một nơi. Nếu cơ sở dữ liệu của bạn được chia sẻ bởi một số hệ thống, thay vào đó bạn có thể sử dụng các kích hoạt rất phù hợp cho nhiệm vụ này.

  2. Tôi không chắc chắn nếu UDT cho phép bạn tùy chỉnh các thông báo lỗi được trả về máy khách khi gặp phải lỗi xác thực.

  3. UDT rất hữu ích nếu quy tắc xác thực tương tự áp dụng cho một số cột. Theo tôi, tôi không thấy đây là một trường hợp rất phổ biến trong ứng dụng kinh doanh với thiết kế cơ sở dữ liệu được chuẩn hóa.

Bạn có thể quan tâm đến việc kiểm tra "Điểm của loại máy chủ do người dùng xác định là gì?" bài viết trên blog.


1
+1 cho điểm thứ ba. Viết cùng một ràng buộc lặp đi lặp lại như tôi không phải là điều tốt nhất để làm, đặc biệt là khi ràng buộc đó có thể thay đổi theo thời gian, đòi hỏi phải thay đổi nó ở một vài nơi.
Arseni Mourzenko

0

Khi bạn nói "không phải tất cả các cơ sở dữ liệu đều hỗ trợ điều này", tôi nghĩ cách tốt hơn để đặt nó là như sau:

Mỗi cơ sở dữ liệu chính đều hỗ trợ điều này, vì chúng hỗ trợ kích hoạt, chức năng và các tính năng nâng cao khác một cách rộng rãi.

Điều này đưa chúng ta đến kết luận rằng đây là một phần của SQL nâng cao và có ý nghĩa tại một số điểm.

Do people actually use domains in their database designs?

Càng ít có thể, do phạm vi bảo hiểm rộng rãi cần thiết (xem xét các toán tử, chỉ mục, v.v.)

If so to what extent?

Một lần nữa, hạn chế đến mức có thể, nếu một loại hiện có kết hợp với một chút logic được xác định bổ sung (nghĩa là kiểm tra, v.v.) có thể thực hiện thủ thuật, tại sao lại đi xa đến vậy?

How useful are they?

Toàn bộ rất nhiều. Chúng ta hãy xem xét một giây một DBMS không tốt như MySQL, mà tôi đã chọn cho ví dụ này vì một lý do: nó thiếu hỗ trợ tốt cho loại inet (địa chỉ IP).

Bây giờ bạn muốn viết một ứng dụng chủ yếu tập trung vào dữ liệu IP như phạm vi và tất cả những thứ đó, và bạn bị mắc kẹt với loại mặc định và chức năng giới hạn của nó, bạn sẽ viết các hàm và toán tử bổ sung (như các hàm được hỗ trợ trong postgreQuery cho ví dụ) hoặc viết các truy vấn phức tạp hơn nhiều cho mọi chức năng bạn cần.

Đây là trường hợp bạn sẽ dễ dàng chứng minh thời gian dành cho việc xác định các chức năng của riêng mình (inet >> inet trong PostgreQuery: phạm vi có trong toán tử phạm vi).

Tại thời điểm đó, bạn đã biện minh cho việc mở rộng hỗ trợ kiểu dữ liệu, chỉ có một bước khác để xác định kiểu dữ liệu mới.

Bây giờ hãy quay lại PostgreSQL có hỗ trợ loại thực sự tốt nhưng không có int unsign .. mà bạn cần, bởi vì bạn thực sự quan tâm đến việc lưu trữ / hiệu suất (ai biết ...), bạn cũng sẽ cần thêm nó cũng như toán tử - mặc dù tất nhiên điều này chủ yếu xuất phát từ các toán tử int hiện có.

What pitfalls have you encountered?

Tôi không chơi xung quanh với điều đó cho đến nay tôi chưa có một dự án nào cả hai yêu cầu và biện minh cho thời gian cần thiết cho việc này.

Các vấn đề lớn nhất mà tôi có thể thấy đi kèm đó là phát minh lại bánh xe, giới thiệu các lỗi trong lớp "an toàn" (db), hỗ trợ loại không đầy đủ mà bạn sẽ chỉ nhận ra vài tháng sau khi CONCAT (cast * AS varchar) thất bại vì bạn đã không định nghĩa một diễn viên (newtype là varchar), v.v.

Có những câu trả lời nói về "không phổ biến", v.v ... Chắc chắn đây là những điều nên và không phổ biến (nếu không, điều đó có nghĩa là dbms thiếu rất nhiều loại quan trọng), nhưng mặt khác, người ta nên nhớ rằng một db (tốt) tuân thủ ACID ( không giống như một ứng dụng) và rằng bất cứ điều gì liên quan đến tính nhất quán sẽ được giữ tốt hơn ở đó.

Có nhiều trường hợp logic nghiệp vụ được xử lý trong lớp phần mềm và nó có thể được thực hiện bằng SQL, nơi an toàn hơn. Các nhà phát triển ứng dụng có xu hướng cảm thấy thoải mái hơn trong lớp ứng dụng và thường tránh các giải pháp tốt hơn được triển khai trong SQL, điều này không nên được coi là thực tiễn tốt.

UDT có thể là một giải pháp tốt để tối ưu hóa, một ví dụ hay được đưa ra trong một câu trả lời khác về loại m / f sử dụng char (1). Nếu đó là một UDT, nó có thể là một boolean thay thế (trừ khi chúng tôi muốn cung cấp các tùy chọn thứ ba và thứ tư). Tất nhiên tất cả chúng ta đều biết điều này không thực sự tối ưu hóa do chi phí cột, nhưng khả năng là có.


Tính năng cụ thể (DOMAIN) không được hỗ trợ bởi tất cả các cơ sở dữ liệu. Có, sử dụng các kích hoạt, ràng buộc và chức năng bạn có thể mô phỏng nó, nhưng điều đó không làm cho nó trở thành một tính năng được hỗ trợ.
Oded

Mỗi cơ sở dữ liệu chính đều hỗ trợ điều này, vì chúng hỗ trợ kích hoạt, chức năng và các tính năng nâng cao khác một cách rộng rãi. Một số người thực sự nổi bật / nhảm nhí thì không, và không ai sử dụng chúng quan tâm vì những hạn chế của họ kéo dài hơn nhiều so với các loại cụ thể của người dùng;)
Morg.

0

Trên giấy tờ, UDT là một khái niệm tuyệt vời. Chúng cho phép bạn thực sự bình thường hóa DB của mình (ví dụ: khi bạn có hai cột phụ thuộc lẫn nhau) và cũng để đóng gói bất kỳ logic nào liên quan đến loại mới của bạn.

Trong thực tế, giá bạn phải trả (hôm nay) là quá cao. Rõ ràng là có chi phí phát triển, nhưng ngoài việc bạn mất sự hỗ trợ từ nhiều công cụ báo cáo và ORM khác nhau, và làm tăng độ phức tạp chung của giải pháp khá nhiều. Không có quá nhiều nhà phát triển ngoài kia quen thuộc với UDT và tôi chưa bao giờ thấy các UDT được quản lý được sử dụng bên ngoài các ví dụ.

Một trong những ví dụ tốt nhất về loại được thực hiện tốt nhất dưới dạng UDT (nếu nó chưa tồn tại) sẽ phải là hierarchyid( liên kết MSDN ). Để duy trì hiệu quả, nó lưu trữ giá trị của nó ở định dạng nhị phân (trái ngược với các triển khai tùy chỉnh varchar thông thường), sẽ rất khó để duy trì nếu không có các chức năng của loại. 10 phương thức mà loại cung cấp cũng được cung cấp tốt nhất như là một phần của loại, trái với các chức năng bên ngoài. Tôi sẽ xem xét sử dụng UDT được quản lý tùy chỉnh trong các trường hợp như thế này - nơi có lợi ích đáng kể để có được bằng cách cung cấp một triển khai hiệu quả và gọn gàng như một loại riêng biệt.


0

Một câu hỏi / câu trả lời thiết thực hơn. Công ty của bạn có cho phép sử dụng nó không?

Công ty của bạn làm việc với một số thương hiệu DBQuery xử lý các DDL khác nhau?

Mỗi thương hiệu cơ sở dữ liệu có thể cung cấp các tính năng bổ sung tốt, như Loại do người dùng xác định, nhưng, nếu công ty của bạn sử dụng một số DB, bạn có thể gặp rắc rối với các tính năng không chuẩn.

Nếu công ty chỉ có bạn hoặc bạn có thể quyết định Cơ sở dữ liệu & tính năng nào bạn sẽ sử dụng, thì bạn có thể sử dụng DDL

Tôi đã làm việc với một số dự án trong đó Loại Xác định Người dùng có thể hữu ích, nhưng, tôi nên sử dụng các tính năng tiêu chuẩn hơn, vì chúng tôi phải xử lý một số DB. (S).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.