Thiết kế dữ liệu: Kết hợp kích thước ngày Thời gian so với kích thước và thời gian ngày và giờ riêng biệt


10

Chúng tôi mới bắt đầu thiết kế cho một kho dữ liệu mới và chúng tôi đang cố gắng thiết kế cách thức kích thước ngày và giờ của chúng tôi sẽ hoạt động. Chúng tôi cần có khả năng hỗ trợ nhiều múi giờ (có thể ít nhất là GMT, IST, PST và EST). Ban đầu, chúng tôi nghĩ rằng chúng tôi sẽ có một chiều thời gian ngày kết hợp rộng xuống mức độ chi tiết có thể là 15 phút, theo cách đó chúng tôi có một khóa trong các bảng thực tế và tất cả dữ liệu thời gian ngày khác nhau cho tất cả các múi giờ được hỗ trợ đều nằm trong một bảng chiều. (tức là Khóa ngày, Ngày GMT, Giờ GMT, Ngày IST, Giờ IST, v.v ...)

Kimball gợi ý nên có kích thước ngày riêng biệt với thời gian của ngày để ngăn bảng phát triển quá lớn (Bộ công cụ kho dữ liệu trang 240) nghe có vẻ tốt tuy nhiên điều đó có nghĩa là chúng tôi có hai khóa trong bảng thực tế cho mỗi múi giờ chúng tôi cần hỗ trợ (một cho ngày và một cho thời gian trong ngày).

Vì tôi rất thiếu kinh nghiệm trong lĩnh vực này, tôi hy vọng ai đó ngoài kia biết được sự đánh đổi giữa hai cách tiếp cận, tức là hiệu suất so với việc quản lý tất cả các phím múi giờ khác nhau. Có thể có những cách tiếp cận khác nữa, tôi đã thấy một số người nói về việc có một hàng riêng trong bảng thực tế trên mỗi múi giờ, nhưng đó có vẻ là một vấn đề nếu các bảng thực tế của bạn là hàng triệu hàng thì bạn cần tăng gấp bốn lần để thêm múi giờ .

Nếu chúng tôi thực hiện hạt 15 phút, chúng tôi sẽ có 131.400 (24 * 15 * 365) hàng năm trong bảng thứ nguyên thời gian ngày của chúng tôi không có vẻ quá kinh khủng cho hiệu suất nhưng chúng tôi sẽ không biết chắc chắn cho đến khi chúng tôi kiểm tra một số truy vấn nguyên mẫu. Mối quan tâm khác với việc có các khóa múi giờ riêng biệt trong bảng thực tế là truy vấn phải nối bảng thứ nguyên sang một cột khác dựa trên múi giờ mong muốn, có lẽ đây là điều mà SSAS quan tâm đối với bạn, tôi không chắc chắn .

cảm ơn vì những suy nghĩ, -Matt


1
Câu hỏi này cũng tồn tại trong Stack Overflow: stackoverflow.com/questions/2507289/ trên .
Jon của tất cả các giao dịch

Câu trả lời:


5

Có ngày và thời gian riêng biệt sẽ cho phép bạn thực hiện tổng hợp theo thời gian một cách dễ dàng. ví dụ: nếu bạn muốn chạy truy vấn để tìm khoảng thời gian nào trong ngày bận rộn nhất. Điều này rất dễ thực hiện bằng cách sử dụng thứ nguyên thời gian riêng biệt.

Ngoài ra, bạn chỉ nên có một phím thời gian. Quyết định thời gian GMT / EST - sau đó sử dụng điều này trong bảng thực tế. Nếu bạn cần chạy các báo cáo dựa trên múi giờ khác, chỉ cần chuyển đổi nó trong ứng dụng hoặc truy vấn của bạn.


Ok, điều đó có ý nghĩa, người dùng không thể nhóm dữ liệu sau đó dựa trên múi giờ của họ, nhưng đó có lẽ là thứ chúng ta có thể sống mà không cần đơn giản hóa thiết kế.
Matt Palmerlee

@MattPalmerlee: Người dùng có thể nhóm theo múi giờ nếu bạn đưa cho họ. Tôi thường đưa nó vào Geographybảng, nhưng nếu không áp dụng, bạn có thể thêm nó làm thuộc tính của bảng thực tế.
Jon của tất cả các giao dịch

5

Chỉ cần theo dõi về cách chúng tôi quyết định triển khai DataWarehouse để hỗ trợ nhiều múi giờ và hiệu quả nhất có thể: Chúng tôi đã chọn tạo một bảng múi giờ (id, name, v.v.) cũng như "Múi giờ cây cầu "bảng trông như thế này:

time_zone_bridge
---------------
date_key_utc
time_key_utc
timezone_id
date_key_local
time_key_local

Bằng cách này, chúng ta có thể giữ các bảng thứ nguyên ngày và giờ bình thường của mình nhỏ, tất cả các sự kiện của chúng ta liên kết với các khóa ngày / giờ UTC, sau đó nếu chúng ta cần báo cáo / nhóm theo múi giờ khác, chúng ta chỉ cần tham gia qua bảng cầu múi giờ và liên kết các khóa ngày / giờ cục bộ trở lại bảng thứ nguyên ngày và giờ. Chúng tôi điền vào bảng cầu múi giờ bằng mã C # được gọi từ SSIS vì điều này ít phức tạp hơn nhiều so với thực hiện trực tiếp công cụ TZ từ SqlServer.


Tôi cũng nghĩ rằng giải pháp của bạn có lẽ là có ý nghĩa nhất mà không vướng vào bất cứ điều gì quá phức tạp. Tôi đang kiểm tra DW của mình bằng bảng timeZone và TimeZoneBridge tương tự như bảng của bạn. Nó cũng có các bảng TimeDimension và DateDimension. Tôi đã tạo một chỉ mục được nhóm trên date_key_local, time_key_local và timezone_id, để dịch thời gian địa phương sang thời gian UTC bằng TimeZoneBridge sẽ nhanh chóng.
DSum

1
Khóa cụm chính của chúng tôi cho bảng cầu nằm trên cột ngày / giờ utc + id múi giờ (nếu tôi nhớ chính xác), vì tất cả các khóa thời gian của bảng thực tế sẽ ở utc, bạn sẽ tham gia vào cầu qua utc Các khóa + id tz, nó có thể hoạt động tốt hơn khi có chỉ mục được nhóm trên đó. Làm những gì có ý nghĩa cho nhu cầu của bạn mặc dù. Tôi rất vui vì câu trả lời của mình đã giúp được ai đó, tôi nghĩ rằng đó là một cách tiếp cận tốt và từ tất cả các thử nghiệm của chúng tôi, nó vẫn khá nhanh, chỉ cần cẩn thận khi nói đến mệnh đề WHERE: lọc ra các phạm vi ngày bạn muốn sớm nhất có thể trong các truy vấn của bạn.
Matt Palmerlee

Điều này chỉ chứa toàn bộ ngày? Hoặc nếu bạn có 86000 giá trị "khóa ngày / giờ" trong bảng thực tế của mình, bảng cầu sẽ có 86000 hàng * n múi giờ được hỗ trợ và chỉ trong một ngày?
Aaron Bertrand

1
có lẽ bạn có thể thêm định nghĩa bảng chính xác mà bạn có, để người đọc có thể thấy các ràng buộc chính, duy nhất.
ypercubeᵀᴹ

@AaronBertrand tùy thuộc vào độ hạt (hoặc độ chi tiết bạn chọn) để theo dõi dữ liệu của bạn, trong trường hợp của chúng tôi, chúng tôi chỉ cần độ chi tiết 15 phút trong các bảng thực tế của chúng tôi để chỉ hỗ trợ 4 * 24 = 96 bản ghi mỗi ngày cho múi giờ chúng tôi muốn hỗ trợ, Điều đó là hoàn toàn hợp lý.
Matt Palmerlee

2

Tôi đã thấy ý tưởng về một nhà kho sử dụng DateTimekích thước kết hợp bị từ chối, nhưng tôi chưa thấy lý do thực sự rõ ràng tại sao. Đơn giản hóa một chút, đây là bảng thực tế tôi đang xây dựng ngay bây giờ:

Transactions
(
...
CreatedDateTimeSK         INT NOT NULL,  -- Four bytes per date...
AuthorizedDateTimeSK      INT NOT NULL,
BatchSubmittedDateTimeSK  INT NOT NULL,
BatchApprovedDateTimeSK   INT NOT NULL,
SettlementDateTimeSK      INT NOT NULL,
LocalTimeZoneSK           TINYINT NOT NULL  -- ...plus one byte for the time zone
)

Các DateTimetrường tham gia vào bảng DateTime:

DateTimes
(
DateTimeSK   INT NOT NULL PRIMARY KEY,
SQLDate      DATE NOT NULL,
SQLDateTime  DATETIME2(0) NOT NULL,
Year         SMALLINT NOT NULL,
Month        TINYINT NOT NULL,
Day          TINYINT NOT NULL,
Hour         TINYINT NOT NULL,
Minute       TINYINT NOT NULL CHECK (Minute IN (0, 30)),
...
)

Đây là ở độ phân giải nửa giờ, vì vậy có 48 hồ sơ mỗi ngày, 350.400 trong 20 năm - khá dễ quản lý.

Ngày / giờ sự kiện được dịch sang UTC khi được lưu trữ, nhưng với LocalTimeZoneSKtrường và bảng cầu nối, chúng ta có thể dễ dàng tham gia để lấy giờ địa phương:

TimeZoneBridge
(
DateTimeSK       INT NOT NULL,
TimeZoneSK       TINYINT NOT NULL,
PRIMARY KEY (DateTimeSK, TimeZoneSK),
LocalDateTimeSK  INT NOT NULL
)

Để có được các giao dịch được tạo ngày hôm nay, thời gian UTC:

SELECT COUNT(*)
FROM Transactions AS T
  INNER JOIN DateTimes AS CD ON T.CreatedDateTimeSK = CD.DateTimeSK
WHERE CD.SQLDate = '2014-08-22'

Để có được các giao dịch được tạo ngày hôm nay, theo giờ địa phương cho giao dịch:

SELECT COUNT(*)
FROM Transactions AS T
  INNER JOIN TimeZoneBridge AS TZB ON T.CreatedDateTimeSK = TZB.DateTimeSK AND T.TimeZoneSK = TZB.TimeZoneSK
  INNER JOIN DateTimes AS CD ON TZB.LocalDateTimeSK = CD.DateTimeSK
WHERE CD.SQLDate = '2014-08-22'

Bạn có thể muốn đơn giản hóa mọi thứ bằng cách thay thế TimeZoneSKbằng phần REALbù (ví dụ: -5.0 cho Giờ ban ngày trung tâm Hoa Kỳ), nhưng điều này sẽ bị hỏng nếu một số ngày / lần cho một bản ghi thực tế là trong Giờ tiết kiệm ánh sáng ban ngày và một số thì không.

Nếu các sự kiện cho một bản ghi thực tế có thể xảy ra ở các múi giờ khác nhau, như một chuyến hàng hoặc chuyến bay, thì bạn cần một trường múi giờ cho mỗi ngày và bạn có tối đa năm byte mỗi ngày.


Đó là một cách tiếp cận sáng tạo. Tuy nhiên, như bạn nói, bạn sẽ chỉ có 350.400 hàng trong bảng mờ thời gian kết hợp của mình, nếu bạn bắt đầu thay đổi hạt thành độ phân giải tốt hơn, bạn sẽ nhanh chóng nhận được hàng triệu bản ghi. Nếu bạn chọn có thứ nguyên ngày riêng biệt so với thứ nguyên thời gian, bạn chỉ có 48 hàng trong bảng thứ nguyên thời gian và chỉ 365 hàng mỗi năm trong bảng thứ nguyên ngày của bạn (hoặc 7300 hàng trong 20 năm). Bảng thực tế của bạn sau đó chỉ cần có một cột cho date_key và time_key. Điều này cũng làm cho nó linh hoạt hơn nếu bạn có một số bảng thực tế chỉ yêu cầu mức độ chi tiết ngày.
Matt Palmerlee

1
Một triệu hàng trong một chiều không liên quan đến tôi - dữ liệu chỉ được thay đổi một lần trong một thập kỷ và chỉ số bao phủ trên PK và hai hoặc ba trường được sử dụng nhiều nhất sẽ chiếm một lượng RAM máy chủ không đáng kể. Tuy nhiên, việc thêm nửa tá SMALLINTvào bảng thực tế hàng tỷ là 12 GB cộng với chi phí hoạt động và giờ bạn đang nói về tiền thật. Đối với những ngày chỉ cần lưu trữ ngày, tất nhiên bạn có thể trỏ chúng vào bản ghi "12:00 AM" cho ngày thích hợp.
Jon của tất cả các giao dịch
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.