Cấu trúc quan hệ tốt cho các đơn vị và chuyển đổi đơn vị phức tạp là gì?


8

Công ty của tôi làm trong ngành Năng lượng và tôi cần đưa ra một cách tốt để đại diện cho việc chuyển đổi các đơn vị đo lường. Tôi đã thực hiện một số tìm kiếm và vẫn chưa tìm thấy một bài viết hay về vấn đề này ở độ sâu tôi cần. Hầu hết các thông tin được công bố về chuyển đổi đơn vị đều cho rằng Đơn vị 1 đã có tỷ lệ chuyển đổi đã biết (mã hóa cứng) để chuyển sang Đơn vị 2 và đó là phép toán đơn giản ( đây là ví dụ phức tạp nhất mà tôi thấy vẫn không giúp được). Tuy nhiên, điều này không phải lúc nào cũng đúng trong thế giới thực và chắc chắn không đúng với những gì chúng ta phải xử lý. (Xin lỗi vì đã viết dài - Tôi đang cố gắng cung cấp càng nhiều thông tin càng tốt!)

Ví dụ rắc rối 1: Một số chuyển đổi thay đổi theo thời gian, chẳng hạn như chuyển đổi $ 5 sang Euro hoặc ngược lại. Điều này nghe có vẻ như không liên quan gì đến năng lượng nhưng nó thực sự làm trong thị trường hàng hóa năng lượng (nghĩ là thị trường chứng khoán).

Ví dụ khó hiểu 2: (Đơn giản hóa) Một số khí đốt tự nhiên nóng hơn các loại khác . Ngoài ra, khí tự nhiên có thể được đo / lưu trữ dựa trên Năng lượng trong khí (như Therms ) HOẶC dựa trên Khối lượng khí đã nói (như MCF là 1000 feet khối), và cũng có những khả năng khác (như như Tôn cho thánh lễ ). Một sự tương tự của xăng là 1 gallon 87-octan Không chì cung cấp ít năng lượng hơn 1 gallon 93-octan Không chì.

Ví dụ rắc rối 3: Ngoài việc có các đơn vị đo lường này, chúng tôi cũng thường phải đối phó với các mức giá, chẳng hạn như $ mỗi Therm hoặc € mỗi MCF . Vì vậy, chúng tôi cần một số cách để làm việc với các mức giá này và cách chúng liên quan đến các đơn vị cơ sở để nếu chúng tôi cần chuyển đổi từ $ mỗi Therm sang € mỗi MCF , chúng tôi có thể và nó sử dụng tỷ lệ được công bố tương tự như chuyển đổi từ Therm sang MCF .

Ví dụ rắc rối 4: Trước đây, tôi đã sử dụng thuật ngữ Năng lượng rất lỏng lẻo và đôi khi có thể không chính xác. Tại thời điểm này và từ bây giờ, điều đó đang thay đổi. Vì vậy, đường cong cuối cùng là chúng ta đối phó với cả Năng lượng cũng như Sức mạnh . Với điện, điều này có nghĩa là kWH so với kW ( một lời giải thích khá tốt mặc dù đó là Yahoo Hỏi & Đáp ). Tương tự dữ liệu: nó sẽ giống như so sánh tổng MB dữ liệu được tải xuống so với Mbps của bạnbăng thông mà ISP cung cấp cho bạn. Giống như dữ liệu, năng lượng cần có thời gian để được cung cấp. Tiếp tục với sự tương tự dữ liệu, chúng tôi có thể phải tính toán băng thông hiệu quả trung bình đã tiêu thụ trong một khoảng thời gian, do đó, khi 60MB được tải xuống trong 1 phút, tốc độ "hiệu quả" sẽ là 60 * 8/60 = 8Mbps. "Bí quyết" ở đây là nếu chúng ta lưu trữ Mbps như một đơn vị, chúng ta cần một số cách để liên kết trực tiếp với MB ngay cả khi nó cũng liên quan đến thành phần thời gian. FORTUNATELY, chuyển đổi từ Năng lượng thành Sức mạnh (hoặc ngược lại) là một điều khá hiếm đối với chúng tôi phải làm, vì vậy giải pháp của chúng tôi nên được tối ưu hóa cho tất cả các ví dụ khó khăn khác và hy vọng cũng cho phép điều này xảy ra, nhưng không xử lý liên quan Năng lượngto Power là một lựa chọn.

Ví dụ rắc rối 5: Đây thực chất là 3 + 4. Chúng ta có thể có cả $ mỗi KW cũng như $ mỗi KWh , vì vậy tỷ lệ xử lý cả Sức mạnhNăng lượng .

Ví dụ dễ dàng: Một số chuyển đổi rất dễ dàng và đây là những chuyển đổi mà hầu hết thông tin trên web có thể xử lý. 1000 Wh = 1kWh và như vậy. Điều tương tự với Therms và Decatherms hoặc kW sang MW, v.v. Tôi không cần trợ giúp ở đây nhưng hãy nhớ rằng ~ 70% chuyển đổi của chúng tôi sẽ thuộc loại này.


Suy nghĩ của tôi về cách bắt đầu nhưng không chắc chắn về cách kết thúc:

  1. Điều này rõ ràng RẤT lộn xộn, vì vậy tôi đề xuất rằng chúng ta nên chọn một đơn vị đo lường tiêu chuẩn để lưu trữ tất cả dữ liệu cho từng loại hàng hóa và "loại sử dụng". Vì vậy, đối với điện, đơn vị năng lượng tiêu chuẩn của chúng tôi sẽ là kWH và đơn vị năng lượng tiêu chuẩn của chúng tôi sẽ là kW. Vì vậy, để chuyển đổi sang bất kỳ đơn vị năng lượng / năng lượng nào khác, chúng tôi sẽ chỉ cần một tỷ lệ chuyển đổi đến / từ tiêu chuẩn của chúng tôi và không phải mọi sự kết hợp có thể. Nếu chúng ta cần chuyển đổi từ MW sang W, chúng ta luôn có thể thực hiện bằng cách chuyển đổi sang / từ kW.
  2. Vì tỷ lệ chuyển đổi có thể phụ thuộc vào thời gian cụ thể, chúng tôi phải cho phép khả năng lưu trữ thời gian này liên quan đến phép đo. Tôi nghi ngờ chúng ta không cần lo lắng về việc tỷ lệ chuyển đổi này thay đổi nhanh hơn một lần mỗi giờ và chúng ta thậm chí có thể giả định một lần một ngày.
  3. Vì tỷ lệ chuyển đổi có thể phụ thuộc vào các giá trị được công bố, chúng tôi phải cho phép khả năng giá trị này được lưu trữ liên quan đến phép đo. Tôi nghi ngờ chúng ta không cần lo lắng về việc tỷ lệ chuyển đổi này thay đổi nhanh hơn một lần mỗi giờ và chúng ta thậm chí có thể giả định một lần một ngày.
  4. Sau khi tất cả đã được tìm ra, tôi dự đoán sẽ tạo ra một dịch vụ web không có gì khác hơn là xử lý tất cả các chuyển đổi đơn vị. Tôi KHÔNG tìm kiếm SQL để thực hiện các chuyển đổi này và tôi có thể thực hiện một số bộ đệm ẩn sáng tạo để thực hiện nó để tôi không hoàn toàn làm hỏng các bảng này nhưng đôi khi sẽ cần xử lý chuyển đổi ~ 400 giá trị trên mỗi trang tải trong trang web do người dùng truy cập . Tôi không chắc chắn nếu / làm thế nào điều này quan trọng.

Tôi không biết ở mức độ nào tôi nên lưu trữ tỷ lệ chuyển đổi không bao giờ thay đổi so với tỷ lệ chuyển đổi thay đổi và chính xác cách khóa chúng theo cách cho phép tôi truy cập nhanh vào các tỷ lệ này theo cách dễ dàng làm việc với.

Bạn có suy nghĩ gì về cách giải quyết vấn đề này hoặc thậm chí một số tài liệu đọc được xuất bản có thể giúp được không? Tôi đang sử dụng SQL Server (sắp có SQL Azure) nhưng điều này thực sự không quan trọng. Lược đồ để thể hiện đúng đây là những gì tôi gặp rắc rối ở đây. Nếu nó đơn giản như inch so với cm, thì thật dễ dàng. Nhưng tỷ lệ chuyển đổi khác nhau là vấn đề ở đây.


1
Có thể đáng để kiểm tra cuốn sách Dữ liệu, Phép đo và Tiêu chuẩn của Joe Celko trong SQL .
onedaywhen

Nếu tôi chọn một đơn vị tiêu chuẩn (có vẻ là ý tưởng tốt), thì Wcó vẻ phù hợp hơn KW. Các si (SI) có thông tin thêm về hệ mét.
ypercubeᵀᴹ

Câu trả lời:


5

Có một vài điều bạn muốn đưa vào thiết kế của mình:

1. Các phép đo cần dấu thời gian

Đảm bảo rằng tất cả các phép đo của bạn có dấu hiệu:

  • Giá trị vô hướng
  • Đơn vị đo lường
  • Ngày và thời gian đo được thực hiện

Điều này sẽ cho phép bạn làm việc với các phép đo cần tính toán chuyển đổi phụ thuộc vào thời gian.

2. Đơn vị đo có thuộc tính

Mỗi đơn vị đo có một vài thuộc tính khác nhau. Những cái rõ ràng là chỉ định, giống như một mã và có thể là một tên mô tả. Ngoài ra còn có một vài thuộc tính quan trọng khác cần giữ cho mỗi đơn vị đo. (i) Loại đơn vị và (ii) Hệ số chuyển đổi thành Đơn vị cơ sở .

Đầu tiên cho bạn biết liệu đơn vị đo của bạn là chiều dài, trọng lượng, năng lượng, sức mạnh, tiền tệ, v.v ... Nó cũng sẽ cho bạn biết đơn vị đo lường cơ bản là gì. Bạn nên chọn chính xác một cho mỗi loại đơn vị. Bạn có thể sử dụng những thứ như kWh nếu bạn thích, nhưng tôi sẽ sử dụng các đơn vị SI cơ bản (nếu có) nếu tôi là bạn.

Thứ hai cho bạn biết đơn vị đo lường của bạn cần được nhân lên để đưa nó đến cơ sở. Tôi đã đề cập rằng đây là một thuộc tính của UOM của bạn, nhưng trên thực tế, nó cần phải nằm trong một bảng con. Khóa nghiệp vụ của bảng con chứa hệ số chuyển đổi cơ sở này là sự kết hợp của UOM, loại đơn vị cơ sở của nó và ngày / giờ. Tôi sẽ giữ cả ngày / thời gian hiệu lực và thời hạn trên bảng hệ số chuyển đổi cơ sở. Điều này cho phép bạn nhanh chóng tìm thấy tỷ lệ phù hợp áp dụng tại bất kỳ thời điểm cụ thể nào. Nếu nó xảy ra là một tỷ lệ không thay đổi, thì không sao. Chỉ cần sử dụng ngày hiệu lực đối chiếu tối thiểu và ngày hết hạn đối chiếu tối đa cho một bản ghi.

3. Cố gắng lái xe trên bàn mọi thứ sẽ khiến bạn không thể thực hiện được Phần cuối cùng của câu đố là xác định phép tính để chuyển từ một loại đơn vị này sang một loại đơn vị khác. Bạn có thể thử lái loại bảng này nhưng cuối cùng, những cái khó sẽ làm cho thiết kế trở nên chung chung (đọc phức tạp và chậm) đến mức không thực tế. Thay vào đó, hãy tạo bảng mã tính toán chuyển đổi và sử dụng bảng này để liên kết một loại Loại đơn vị với loại Loại đơn vị khác. Thực hiện các tính toán thực tế trong một số mã ở đâu đó. Đoạn mã nào bạn sử dụng cho bất kỳ chuyển đổi cụ thể nào là bảng mã cho bạn biết. Cách tính được thực hiệnchỉ là trong mã. Bạn có thể có một phép tính cho mỗi thứ dễ dàng khác nhau, như diện tích cần hai độ dài và khối lượng cần ba độ dài cũng như những phép khó hơn như công việc cần năng lượng và thời gian.

Khi bạn nhận được các chi tiết của thiết kế của bạn đã tìm ra bạn nên viết blog và quay lại đây để gửi một liên kết!


Đối với quan điểm số 3 của bạn, tôi hoàn toàn đồng ý và đây là lý do tại sao tôi dự định sử dụng dịch vụ web để thực hiện các chuyển đổi này. Hoặc ít nhất là những gì tôi cho là chuyển đổi "phức tạp" hoặc "động" - những chuyển đổi "đơn giản" hoặc "tiêu chuẩn" mà tôi có thể điều khiển bảng (như kW sang MW) nhưng tôi vẫn có thể (Tôi sẽ ở trong Azure để tôi có thể DỄ DÀNG cân bằng tải / mở rộng dịch vụ web này nếu cần thiết). Hãy để tôi điều tra ý tưởng của bạn về việc loại bỏ các tỷ lệ chuyển đổi khác nhau khỏi bảng UOM. Tôi sợ rằng tôi đang thiếu một chiếc cà vạt để theo dõi tỷ lệ chuyển đổi nào mà một phép đo cụ thể đi kèm nhưng hãy để tôi xem ...
Jaxidian

@Jaxidian - Tôi nghĩ rằng sự ràng buộc để theo dõi phép tính chuyển đổi nào sẽ sử dụng là giao điểm giữa hai loại đơn vị. Về mặt kỹ thuật, đây có thể là hai giao điểm, một cho mỗi hướng chuyển đổi do các hàm nghịch đảo có thể không tầm thường đối với các phép tính phức tạp hơn. Tỷ lệ chuyển đổi nào đi với một phép đo cụ thể phải là giao điểm giữa loại đơn vị và đơn vị đo. (Xem 2 (i) & 2 (ii) trong câu trả lời của tôi.) Tính toán của bạn nên hoạt động với các đơn vị trong UOM cơ sở để các đầu vào sử dụng bất kỳ UOM nào khác có thể được "chuẩn hóa" trên đường sử dụng tỷ lệ giao cắt.
Joel Brown

1

Đây là một cái gì đó bạn có thể sử dụng quan điểm hoặc truy vấn cho. Có một bảng với dữ liệu thô và một bảng khác có tỷ lệ chuyển đổi mà bạn cần áp dụng - có thể có ngày hoặc một số thông tin khác nếu tỷ lệ áp dụng là nhạy cảm với thời gian hoặc tình huống. Sau đó, tạo một truy vấn hoặc chế độ xem thực hiện chuyển đổi bạn cần bằng cách nối các bảng lại với nhau. Bằng cách này, bạn có thể thay đổi giá trị tỷ lệ chuyển đổi theo yêu cầu và tính toán lại.

Ví dụ đơn giản (PostgreSQL) cho một kịch bản giả định, của bạn sẽ khác:

CREATE TABLE join_test.amounts
(
  amount integer,
  unit character varying(10)
);

CREATE TABLE join_test."conversion"
(
  unit character varying(10),
  ratio integer
);

insert into join_test.amounts ( amount,unit) values (10 , 'dollar' );
insert into join_test.amounts ( amount,unit) values (10 , 'euro' );
insert into join_test.amounts ( amount,unit) values (15 , 'dollar' );
insert into join_test.amounts ( amount,unit) values (15 , 'euro' );

insert into join_test.conversion ( unit, ratio) values ('dollar', 2 );
insert into join_test.conversion ( unit, ratio) values ('euro', 3 );

-- create this as a view
select a.amount, c.ratio, a.amount * c.ratio as "result"
from    join_test.amounts a,
    join_test.conversion c
where a.unit = c.unit
and   c.unit = 'euro'
and   a.unit = 'euro'   ;

Tôi không tin tài khoản này cho một số biến của mình và điều này chỉ xử lý các tình huống dễ dàng. Bạn không tính đến thực tế là tỷ lệ chuyển đổi thay đổi gần như mỗi giây (hoặc trong trường hợp của tôi, mỗi ngày) và tôi cần đảm bảo rằng tôi thực hiện chuyển đổi với tỷ lệ phù hợp. Nó không chỉ luôn là tỷ lệ "hiện tại" mà tôi cần mà còn có khả năng tất cả chúng đều trên cơ sở mỗi chuyển đổi.
Jaxidian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.