2012-05-29 28 views
7

Tôi đang làm việc với SQL Server và hầu hết các bảng có các cột nhận dạng thuộc loại int. Và bây giờ, tôi đã bắt gặp một cuốn sách, điều đó nói rằng không nên sử dụng cơ chế này. Khuyết điểm/ưu điểm của việc sử dụng cột nhận dạng khi sử dụng NHibernate làm ORM là gì?Các cột Nhận dạng Máy chủ SQL với NHibernate - để sử dụng hoặc không sử dụng

+0

Cũng từ góc độ cơ sở dữ liệu, chuyên nghiệp là có một cách mạnh mẽ để xác định duy nhất một hàng trong bảng, đặc biệt là bảng có thể có hàng nghìn hoặc hàng triệu hàng. Có bất kỳ cột ID/tham chiếu nào khác là duy nhất không? Tính duy nhất có được thực thi bằng cách sử dụng một ràng buộc UNIQUE không? –

+2

@ChrisCannon Câu hỏi và đề xuất dựa trên ** không ** về việc loại bỏ khóa chính, nhưng chỉ về cách các giá trị của khóa chính được tạo ra. NHibernate có thể làm việc hiệu quả hơn khi nó tự quản lý việc tạo khóa chính. –

+1

Tôi đã đào hết trên google và tôi không thấy câu trả lời hay cho câu hỏi này. Tôi nghĩ câu hỏi đang mở. NH muốn sử dụng GUID ... nhưng GUID là khủng khiếp như các khóa chính trong SQL Server (xem http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering- key.aspx). Trong DB của chúng tôi, đó là lớn, chúng tôi có thể tiết kiệm DOZENS của GB chỉ bằng cách thay đổi từ GUID để nhận dạng. Đã đến lúc để viết tốt hơn về chủ đề này .... – Jonesome

Trả lời

5

Tôi không phải là chuyên gia NHibernate, nhưng theo như tôi hiểu, việc sử dụng các cột nhận dạng đã phá vỡ UnitOfWork và gây thêm các chuyến đi vòng tới cơ sở dữ liệu.

Fabio Maulo (sau đó đứng đầu dự án của NHibernate, tôi không chắc chắn nếu ông vẫn là ngày nay) có một bài đăng blog, nơi ông giải thích điều này một cách chi tiết:
Identity: The never ending story

Dưới đây là một (dài hơn) bài đăng trên blog có mã mẫu:
NH2.1.0: generators behavior explained

Tuy nhiên, lưu ý rằng cả hai bài đăng trên blog đều khoảng ba tuổi và nói về NH 2.1.0 và phiên bản hiện tại là NH 3.3. Nhưng tôi cho rằng vấn đề như được mô tả bởi Fabio vẫn tồn tại ngày hôm nay.

+1

Tôi nghĩ rằng có một vấn đề lớn hơn .... Vâng, khái niệm "đơn vị công việc" và tất cả đều quan trọng. Nhưng hạnh phúc SQL Server cũng rất quan trọng! GUID làm cho các khóa chính xấu trong SQL Server (http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx) Vì vậy, trong NH 3.x, có thể sử dụng danh tính không? (Chúng ta cần phải biết!) – Jonesome

+0

Không có lý do tại sao NHibernate không thể tạo ra SQL trả về cột nhận dạng mới được chèn vào trong cùng một chuyến đi tạo bản ghi. –

+0

Không, vấn đề là: khi bạn tạo 20 đối tượng mới trong UnitOfWork, NH phải thực hiện một chuyến đi khứ hồi tới cơ sở dữ liệu cho mỗi cơ sở dữ liệu để có được ID thông qua Identity ... loại đánh bại mục đích của UnitOfWork . Với các chiến lược tạo ID khác, NH chỉ cần thực hiện ** một ** chuyến đi khứ hồi ở cuối. –

4

Nó không có sự khác biệt nếu chúng là một cột nhận dạng hay không. Vai trò của một ORM là ánh xạ các thực thể dữ liệu vào cơ sở dữ liệu để không ra lệnh cấu trúc/thiết kế cơ sở dữ liệu. Tôi đã sử dụng một triển khai với các cột nhận dạng và nó hoạt động tốt.

+5

Có nó hoạt động. Đó là một câu hỏi về hiệu quả. Sử dụng một cột nhận dạng hoặc cơ sở dữ liệu khác được kiểm soát khóa chính phát sinh NHibernate từ lô INSERT báo cáo. –

+1

@Oskar - bạn nên viết câu trả lời :) Cảm ơn – dragonfly

+0

Hầu hết các cơ sở dữ liệu hỗ trợ chèn hàng loạt theo cách trả về cột nhận dạng. Xem mệnh đề 'Output' trong SQL Server để biết ví dụ. (Có hay không NHibernate không là một vấn đề khác.) –

Các vấn đề liên quan