2010-10-18 30 views
7

Tôi đang tìm cách tạo ra một mô hình db của các đơn vị khác nhau và mối quan hệ của chúng với nhau. Ví dụ, 36 inches = 3 feet = 1 yard = .9144 mét, vv Bảng này cũng sẽ lưu trữ ly bằng ounce, pound, kg, gam, cm và tất cả các loại phép đo.Làm cách nào để bạn lập mô hình bảng cho chuyển đổi đơn vị?

Bạn làm như thế nào? Tôi đã suy nghĩ về một cái gì đó như thế này:

 
Amount | Units | ConversionFactor | ConversionUnits 
1  | foot | 12    | inches 
1  | yard | 36    | inches 

Nhưng thẳng thắn, điều này có vẻ như một ý tưởng tồi tệ. Đang cố gắng tìm ra bao nhiêu feet trong một sân sẽ rất phức tạp, và tôi không nghĩ rằng tôi có thể lưu trữ tất cả các chuyển đổi tôi cần.

Có ý tưởng nào khác không? Tôi biết đây là một vấn đề được giải quyết. Cảm ơn!

+0

Tại sao bạn cần để lưu trữ các đơn vị chuyển đổi trong cơ sở dữ liệu? Họ sẽ không thay đổi. –

+1

Ahh, làm thế nào đơn giản này sẽ được nếu bạn guys đã lên hệ thống số liệu. Nhưng đó là một cuộc thảo luận khác. – steinar

+0

Bởi vì tôi muốn lưu trữ thực phẩm và thông tin dinh dưỡng của họ. Tôi muốn nhập một công thức theo gam và chuyển nó thành ounces bất cứ khi nào tôi cảm thấy thích nó. –

Trả lời

5

Lưu trữ conversions to SI units, không cho các đơn vị không phải số liệu khác. Sau đó, bạn có thể chuyển đổi giữa các đơn vị mà không cần biết chuyển đổi rõ ràng.

Unit   | Class  | Base Unit Multiplier 
------------------------------------------------------ 
foot   | length  | 0.304800610 
yard   | length  | 0.914401830 
square foot | area  | 0.092903040 
... 

Vì vậy, 14 feet trong sân là:

14 feet * 0.304800610 = 4.26720854 meters 
4.26720854 meters * 0.914401830⁻¹ = 4.66666667 yards 
+1

-1 cho các đơn vị SI - giải pháp này chỉ có khả năng hữu ích trong các tình huống mà đơn vị SI là chuẩn, nếu không có khả năng sẽ giới thiệu sai số làm tròn (ví dụ: nếu chuyển đổi giữa feet và yard). Số dư lượt truy cập bằng +1 cho bao gồm Lớp. –

+3

@ Mark - đơn vị SI * là * tiêu chuẩn (cho 6 tỷ người trong chúng ta, dù sao :) Bên cạnh đó, bạn có thể nhận được các lỗi làm tròn với các đơn vị hoàng quá, ví dụ .: '1 chân = ,000189393939394 miles'. – Seth

+0

bạn ở Portland nào? :) Tôi thường khuyên bạn nên chọn đơn vị chuyển đổi nhỏ nhất có thể làm đơn vị cơ sở. –

2

Tôi nghĩ schema đề xuất các bài bản gốc là tốt, ngoài việc không bao gồm lớp (như trong câu trả lời của Seth) - bạn không muốn thử để chuyển đổi giữa pints và inch.

Chuyển đổi giữa hai đơn vị mà đơn vị chuyển đổi đơn giản chỉ đạt được bằng cách truy lục các bản ghi chuyển đổi của cả hai đơn vị và chia yếu tố kia (ví dụ 36/12 = 3 feet trong một yard).

Nếu bạn đặc biệt quan tâm về độ chính xác, bạn có thể đảm bảo rằng tất cả các đơn vị cho một lớp nhất định có mục nhập cho tất cả các đơn vị khác trong cùng một lớp - điều này đánh tôi là quá mức cần thiết.

3

Chọn đơn vị cơ sở cho mỗi dimension bạn quan tâm (đọc trang wiki đó, nó sẽ hữu ích). Ví dụ, nếu hầu hết các dữ liệu của bạn là trong các đơn vị SI, bạn sẽ chọn kilogram cho khối lượng, thứ hai cho thời gian, mét cho khoảng cách, và như vậy. Nếu hầu hết dữ liệu của bạn ở các đơn vị ở Hoa Kỳ, hãy chọn các đơn vị từ số US customary units, ví dụ: pound cho khối lượng, độ dài chân, giây cho thời gian.

Sau đó lưu trữ, cho mỗi đơn vị thực tế bạn muốn có thể xử lý, hệ số chuyển đổi cho đơn vị cơ sở phù hợp với kích thước. Vì vậy, nếu bạn chọn chân như đơn vị cơ sở của bạn về khoảng cách, lưu trữ

Unit Dimension Factor 
Foot Distance  1 
Metre Distance  3.28084 
Mile Distance  5280 

Để thực sự làm một chuyển đổi, một khi bạn đã kiểm tra rằng các kích thước phù hợp, chỉ cần nhân với các Factor của đơn vị nguồn, và chia cho Factor của đơn vị đích. Ví dụ, để có được từ mét để dặm, nhân với 3,28084, sau đó chia cho 5280.

2
CREATE TABLE UnitConversion 
(
    [FromUnit] NVARCHAR(100), 
    [ToUnit] NVARCHAR(100), 
    [FromOffset] DECIMAL(29,10), 
    [Multiplicand] DECIMAL(29,10), 
    [Denominator] DECIMAL(29,10), 
    [ToOffset] DECIMAL(29,10) 
) 

ToUnit = (FromUnit + FromOffset) * nhơn/Mẫu số + ToOffset

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