2009-06-26 33 views
5

Trong mã một có thể chỉ định các hằng số có thể truy cập toàn cục/enums/etc sau đó có thể được sử dụng lại thông qua ứng dụng. Điều này cho phép sử dụng các tên có ý nghĩa như 'Mazda' thay vì các số như '2'.Loại bỏ các số "Magic" trong SQL Server

Chúng tôi muốn thực hiện tương tự với quy trình lưu trữ SQL Server của chúng tôi, nhưng không chắc chắn cách tốt nhất để thực hiện điều này.

Ví dụ cho các bảng sau đây (Giản đồ xe ngôn):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

Vì vậy, thay vì viết

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

Chúng tôi muốn viết một cái gì đó giống như

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

Một hạn chế chúng tôi có là chúng tôi không thể dựa vào Manufacturer.Name ở cùng cho cuộc sống của ứng dụng. Chúng tôi đã suy nghĩ về việc có một cột "Mã" mà không bao giờ thay đổi và tham gia đang nhìn lên như thế này:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

tôi là một chút do dự về vấn đề này vì nó sử dụng thêm tham gia và so sánh chuỗi có thể được sai chính tả .

Cách tốt nhất để thực hiện điều này là gì mà không phải khai báo các biến trong mỗi Quy trình được lưu trữ?

Trả lời

4

Chúng tôi đã làm điều này một vài cách sau:

  • chức năng người dùng định nghĩa mà trả về "con số kỳ diệu" theo tên.
  • Sử dụng cột nchar (4) thay vì cột int và đưa ra các mã ít khó hiểu hơn. Vì vậy, Nissan sẽ là "NISN" thay vì 1. Một chút đẹp hơn.
+0

Được đề xuất với đề xuất đầu tiên, nhưng đã quá trễ cho đề xuất thứ hai. Có lẽ lần sau. –

+0

Điều khó khăn với vấn đề này là số ma thuật thường tương ứng với một enum trong mã máy khách của bạn. Tại một số điểm, bạn sẽ vít lên đồng bộ hóa tra cứu SQL của bạn với enum khách hàng. MS SQL Server cung cấp một điểm tích hợp rất gọn gàng ở đây: bạn có thể mã một UDF CLR để trả về giá trị enum, về cơ bản thực thi một số kiểu an toàn thời gian chạy. Bạn vẫn cần phải đảm bảo truy vấn của bạn có được tên của các giá trị enum ngay cả khi tôi đã không bao giờ tìm thấy một cách xung quanh phần này của vấn đề. –

1

Bạn không cần lưu số trong cơ sở dữ liệu. Có những quản trị viên DB ở đó, những người vẫn yêu thích ý tưởng về 'các khóa tự nhiên'. Thay vì sử dụng một ID, họ chỉ cần sử dụng một khóa tự nhiên để xác định duy nhất nhà sản xuất. Thông thường, điều này có thể dẫn đến nhiều khóa chính. Bạn có thể phải có 'Mazda' 'Canada' làm định danh duy nhất cho nhà sản xuất.

Cá nhân, tôi không thích phương pháp này và muốn có một ID duy nhất cho mọi đối tượng có thể nhận dạng được lưu trữ trong các bảng của tôi. Điều này có nghĩa là tạo một bảng mới là một tra cứu. 2, 'Mazada'. Sau đó, bạn có thể tạo chế độ xem kéo 'Mazda' ở nơi có 2 trong cơ sở dữ liệu, sau đó chạy truy vấn đối với chế độ xem. CHỌN * từ v_cars nơi nhà sản xuất = 'Mazda'

+0

Bên cạnh việc đến muộn để thay đổi sắp xếp, tôi đồng ý với bạn về việc không sử dụng các khóa tự nhiên trong những trường hợp này vì nó giúp việc sử dụng enums dễ dàng hơn trong mã. Tôi thích ý tưởng chế độ xem. –

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