2012-01-09 41 views
14

Có cách nào tốt hơn hoặc dễ dàng hơn để lưu trữ enums (Enumerations có sẵn bằng ngôn ngữ lập trình như C#) trong cơ sở dữ liệu SQL Server không? mỗi người trong số họ (đặc biệt là khi có rất ít hàng trong mỗi bảng)? Tôi đã tìm thấy một số article đề xuất chỉ tạo một bảng tra cứu cho tất cả các bảng liệt kê và cách tiếp cận bị chỉ trích bởi một số người trong các nhận xét cho biết vi phạm tính toàn vẹn dữ liệu tham chiếu. nếu ở tất cả các điều tra được sử dụng bởi chỉ có một bảng, nó là một thực hành tốt để sử dụng một số mã được xác định trước và sau đó thêm một ràng buộc cho họ (có thể được sử dụng mở rộng tài sản)?enums trong cơ sở dữ liệu SQL Server

+1

"Một bảng tra cứu cho tất cả các bảng liệt kê", còn gọi là "Bảng tra cứu thực sự", còn được gọi là "OTLT", là một mẫu chống SQL nổi tiếng. Bạn có thể Google đó. Tôi muốn tranh luận rằng liệt kê chính họ là một cơ sở dữ liệu chống mẫu, bởi vì họ không dễ dàng thích ứng với phần mở rộng (thuộc tính bổ sung). –

Trả lời

18
  1. Cá nhân, tôi muốn xác định một bảng tra cứu mỗi enum, bởi vì nó là một loại tài liệu là tốt. Nếu ai đó muốn biết id là viết tắt của cái gì, anh ta sẽ dễ dàng tìm thấy nó trong một cái bàn. Tìm kiếm thông tin này trong một ràng buộc cột không phải là điều hiển nhiên.

  2. Việc thêm các giá trị mới trong một bảng cũng dễ dàng hơn nhiều so với giới hạn.

  3. Nếu bạn tạo sơ đồ cơ sở dữ liệu, các bảng tra cứu riêng lẻ sẽ xuất hiện hợp lý hơn.

  4. Bạn có thể thêm thông tin bổ sung vào các bảng tra cứu riêng lẻ, nếu được yêu cầu (như nhận xét, cột sắp xếp, một số loại cờ, v.v ...).

  5. Và như bạn đã nói, nó là tốt hơn cho toàn vẹn tham chiếu

Tuy nhiên; nếu bạn đang sử dụng một o/r-mapper với cách tiếp cận mã đầu tiên, sử dụng enums được cung cấp bởi ngôn ngữ lập trình cảm thấy khá tự nhiên. Điều này là do bạn không thiết kế một cơ sở dữ liệu mà là một mô hình đối tượng. O/r-mapper tạo cơ sở dữ liệu tự động cho bạn.

0

Khi thay đổi enum bên trong mã của bạn cũng sẽ yêu cầu phát hành phiên bản ứng dụng mới, tôi sẽ không tìm kiếm bảng tra cứu nào cả, nhưng chỉ thêm ràng buộc kiểm tra vào cột được đề cập.

Nếu bạn tuy nhiên cần phải lưu trữ tên địa phương của enum trong cơ sở dữ liệu, sau đó tôi sẽ đi cho một bảng tra cứu cho mỗi enum.

"một bảng tra cứu thực sự" sẽ không cung cấp cho bạn bất kỳ lợi thế nào.

Chỉnh sửa: nếu bạn cần truy xuất động giá trị enum (ví dụ: thả xuống) hoặc cần tìm giá trị nào được phép, sau đó sử dụng bảng tra cứu có thể tốt hơn cho bạn.

+0

Tôi chưa có bất kỳ yêu cầu địa phương hóa nào. chỉ có vấn đề với ràng buộc kiểm tra là chỉ có thể sử dụng nếu dữ liệu tra cứu chỉ được sử dụng trong một bảng và người dùng bảng sẽ phải xem xét định nghĩa lược đồ của bảng để xem mã và mô tả được phép cho cột đó – RKP

+0

Nếu bạn cần xem các giá trị được cho phép bằng cách sử dụng câu lệnh 'SELECT', thì bảng tra cứu có thể tốt hơn cho bạn. Về "chỉ có thể được sử dụng trong một bảng": nó được một lúc kể từ khi tôi sử dụng SQL Server. Trong PostgreSQL, tôi sẽ định nghĩa một 'miền' mới đóng gói ràng buộc kiểm tra và làm cho nó có thể sử dụng lại được. Có lẽ một cái gì đó tương tự là có thể trong SQL Server là tốt. –

+0

Ngay cả khi các tên được hiển thị được tạo trong mã, có thể hữu ích khi có chúng trong một bảng, vì chúng có thể được sử dụng trong một số công cụ báo cáo. Ngay cả khi bạn đang thực hiện một truy vấn trong trình quản lý máy chủ sql để kiểm tra một cái gì đó, các tên có thể hữu ích. –

0

Sử dụng cùng một bảng cho một số lần tra cứu có thể trở lại để ám ảnh bạn. Một ví dụ là tạo Chế độ xem được lập chỉ mục. Điều này có thể giúp với hiệu suất nếu bạn có một số trường mà bạn muốn hiển thị giá trị tra cứu, nhưng SQL Server (ít nhất là 2005) sẽ không cho phép bạn tham chiếu cùng một bảng nhiều hơn một lần (Nếu điều này đã được sửa, tôi sẽ thực sự muốn biết làm thế nào để đi về nó bởi vì tôi thực sự có thể sử dụng nó trong một ứng dụng hiện tại với một bảng tra cứu duy nhất.).

Một trong các tra cứu của bạn có thể yêu cầu trường bổ sung và bằng cách sử dụng một bảng, bạn sẽ có rất nhiều giá trị không cần thiết. Việc lập chỉ mục có thể linh hoạt hơn với các bảng riêng biệt. Điều gì sẽ xảy ra nếu trường mới cần được yêu cầu cho một loại tra cứu cụ thể? SQL Server sẽ làm tốt với một ràng buộc, nhưng khi được ném vào cùng một bảng thì phức tạp hơn một chút là cần thiết.

Bạn có thể không gặp phải bất kỳ sự cố nào trong số này ngay bây giờ. Tôi chỉ không thấy một lợi thế cho một bảng duy nhất, nhưng một số ứng dụng muốn có một cách năng động để tạo danh sách tra cứu và sẽ không tạo ra một bảng mới cho mỗi bảng.

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