2008-10-09 29 views
7

Trong khi thiết kế một bảng đồng nghiệp của tôi ở đây nói rằng tôi nên tránh cột nhận dạng vì nó là đặc trưng cho SQL Server và MS Access, Nhưng tôi khác với quan điểm của mình vì nó làm cho mã của tôi đơn giản hơn.DB: Để sử dụng cột nhận dạng hay không?

Tôi có nên sử dụng cột nhận dạng hay không? Nếu không phải là cách tốt nhất để tạo ra các cột nhận dạng từ mã ứng dụng là gì?

Trả lời

10

Bạn không thể ly dị hoàn toàn ứng dụng khỏi nhà cung cấp cơ sở dữ liệu. Nếu bạn làm bạn sẽ không thể tận dụng lợi thế của bất kỳ tính năng cơ sở dữ liệu của bạn cung cấp cho bạn.

Tôi muốn nói sử dụng cột nhận dạng. Nếu bạn chuyển sang Oracle (ví dụ), bạn có thể sử dụng một chuỗi. Thực sự là một sự thay đổi lớn.

Tôi không biết bạn đang sử dụng công nghệ nào, nhưng có một thứ giúp bạn sử dụng một công cụ như Hibernate hoặc iBATIS (tôi nghĩ cả hai đều có sẵn cho Java và .NET). từ các chi tiết triển khai cơ sở dữ liệu. Sau đó, nếu bạn thay đổi nhà cung cấp cơ sở dữ liệu, bạn sẽ không cần phải thay đổi mã ứng dụng, chỉ cần cấu hình. (Theo lý thuyết, ít nhất!)

5

Có quan trọng đối với nền tảng Microsoft không? Ứng dụng của bạn có phải là di động hay không, tức là bạn có định chuyển nó sang mysql/postgres/gì không?

+1

Nó không được lên kế hoạch kể từ bây giờ, tuy nhiên tôi đoán nó sẽ là máy chủ MS SQL mãi mãi, trừ khi MS sẽ gặp rắc rối trong tương lai. – Kishork

3

Theo như tôi biết, mọi RDBMS hơi nghiêm trọng có một số loại lược đồ đánh số duy nhất trên mỗi bảng.

  1. Access và SQL Server có cột sắc
  2. MySQL có các cột tự động tăng
  3. PostgreSQL có chuỗi
  4. sqlite có một cột ROWID ngầm
  5. Oracle có một số loại chuỗi mặc dù tôi không hoàn toàn quen thuộc với nó

Tôi chủ yếu sử dụng nó, về mặt lý thuyết, nó không phải lúc nào cũng là yêu cầu nhưng nếu bạn muốn duy trì tham khảo ential toàn vẹn một int là ít hơn để lưu trữ và dễ dàng hơn để so sánh hơn một varchar, đặc biệt là nếu các phím nước ngoài của bạn sẽ phức tạp hơn một cột duy nhất.

+0

Bạn không quen thuộc với trình tự trong Oracle, vì vậy bạn quyết định rằng "mỗi RDBMS hơi nghiêm trọng có một lược đồ số cho mỗi bảng"? –

+0

@Dave, 42 luôn là số nhưng con số không phải lúc nào cũng là 42. – Kris

+0

vâng, không biết ý bạn là gì. Thời gian qua tôi đã kiểm tra Oracle đã có máy phát điện, giống như trình tự của PostgreSQL, không phải trên mỗi bảng. –

5

Sử dụng cột Identity!

Nó tách riêng "Logic ứng dụng" của bạn khỏi "Logic nghiệp vụ".

Giả sử bạn sử dụng "email" làm khóa chính (có ý nghĩa về mặt "logic nghiệp vụ"). Bạn sẽ gặp rắc rối khi email đó không còn tồn tại và người dùng của bạn muốn chỉnh sửa email của bạn.

2

Không sử dụng cột nhận dạng trừ khi bạn nhận thức đầy đủ về các cạm bẫy của nó và không có lý do hợp lệ để sử dụng SEQUENCE hoặc trình tạo trình tự mô phỏng.

Trình tự linh hoạt hơn nhiều và không có những hạn chế/hạn chế mà cột Identity có.

Từ http://www.jumpingbean.co.za/blogs/mark/identity_autoincrement_fields_and_database_sequences:

Cơn đau với auto-incrementing

sao chép trên dữ liệu trong khi bảo tồn giá trị bản sắc

Auto-incrementing phím có thể trở thành một nỗi đau khi bạn cần sao chép toàn bộ tabels và bảo vệ khóa chínhGiá trị. Cố gắng chèn trực tiếp vào cột nhận dạng sẽ dẫn đến lỗi được nêu ra. Thông thường nhà cung cấp cung cấp một số tuyên bố rằng cho phép bạn tạm thời hủy bỏ ràng buộc để bạn có thể chèn các giá trị hiện tại . Trong MSSQL, bạn có thể ra lệnh

"SET IDENTITY_INSERT product ON".

Các nhà cung cấp khác sẽ yêu cầu bạn thả ràng buộc và sau đó bật lại.

Thêm đau — cách truy xuất giá trị của hàng mới được chèn?

Bên cạnh đó máy chủ thường cung cấp nhiều cách khác nhau để lấy giá trị cột sắc cho một hàng mới chèn vào. Đối với MySQL, đây là hàm LAST_INSERT_ID() và cho MSSQL nó là @@ identity, ví dụ: chọn @@ identity.

MS SQL Server 2011 sẽ hỗ trợ SEQUENCE.

Nếu bạn sử dụng một máy chủ RDBMS mà không hỗ trợ SEQUENCE (như MSSQL trước năm 2011 hoặc MySQL), có hai lựa chọn:

  1. Chuyển đến PostgreSQL. Đây là lựa chọn dễ nhất, thực sự. Bạn nhận được máy chủ RDBMS nguồn mở hoàn chỉnh, cấp doanh nghiệp. Và bạn cũng có thể có hỗ trợ thương mại nếu bạn muốn.
  2. Sử dụng thư viện truy cập dữ liệu hỗ trợ mô phỏng SEQUENCE. Triển khai JPA 2.0 ví dụ: EclipseLink, Hibernate tạo this very trivial for you (TABLE strategy). Nó không loại trừ lẫn nhau với những điều trên. Sử dụng JPA 2.0 với PostgreSQL sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều so với JDBC thô với MySQL.
+0

Tôi nghĩ nếu bạn thêm một bảng mới gọi là "IDENTITY" và lưu trữ ID mới nhất cho mỗi bảng bên trong nó, nó sẽ khá đơn giản để nói SET [tablename] +1 mỗi khi bạn cần một ID mới cho một bảng. – BerggreenDK

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