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
Trả lời
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.
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
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. –
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. –
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.
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. –
@Oskar - bạn nên viết câu trả lời :) Cảm ơn – dragonfly
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.) –
- 1. sql sử dụng máy chủ cột
- 2. DB: Để sử dụng cột nhận dạng hay không?
- 3. Máy chủ SQL, sử dụng bảng dưới dạng hàng đợi
- 4. Phát hiện Sử dụng Máy chủ SQL với truy vấn
- 5. NHibernate không kết nối với máy chủ sql
- 6. Máy chủ SQL: Các cột chỉ mục được sử dụng như thế nào?
- 7. Máy chủ SQL: cách thêm cột nhận dạng mới và điền cột có id?
- 8. Ngoại lệ máy chủ SQL: "Tên cột xxx không hợp lệ" khi sử dụng JDBC
- 9. Máy chủ SQL - sử dụng các cột từ truy vấn chính trong truy vấn con
- 10. Tôi có thể sử dụng cột nhận dạng Máy chủ SQL để xác định thứ tự các hàng được chèn không?
- 11. Sử dụng LINQ với NHibernate
- 12. Bảng máy chủ sql có thể có hai cột nhận dạng không?
- 13. Sử dụng InheritableThreadLocal với ThreadPoolExecutor - hoặc - một ThreadPoolExecutor không sử dụng lại các chủ đề
- 14. Android: Nhận dạng giọng nói mà không cần sử dụng máy chủ google
- 15. Có cần sử dụng # để tạo các bảng tạm thời trong máy chủ SQL không?
- 16. truy vấn cột nhị phân bằng cách sử dụng như trong máy chủ sql
- 17. Sử dụng cột Guid as Id trong NHibernate gây ra ngoại lệ định dạng khi sử dụng MySQL
- 18. Giá trị cột nhận dạng máy chủ SQL bắt đầu bằng 0 thay vì 1
- 19. Cập nhật Máy chủ SQL Sử dụng Nhiều Bảng
- 20. máy chủ sql tìm bản sao trên một cột nhưng sử dụng chọn nơi
- 21. Máy chủ SQL - Bao gồm NULL sử dụng UNPIVOT
- 22. Bình nào để sử dụng để kết nối với máy chủ MS SQL
- 23. sử dụng Máy chủ Windows Script
- 24. Có ai sử dụng (hoặc xem xét sử dụng) Sql Server Compact Edition không?
- 25. Sử dụng Case để khớp các chuỗi trong máy chủ sql?
- 26. Máy chủ proxy sử dụng Indy
- 27. Tiểu sử không khớp với số nhận dạng ứng dụng
- 28. Cách sử dụng như điều kiện với nhiều giá trị trong máy chủ sql 2005?
- 29. Sử dụng Django trừ máy chủ web
- 30. T-SQL sử dụng EXISTS như Cột
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? –
@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. –
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