Như đã đề cập trong một chú thích đó là vì đơn giản, vì nó hơi khó thực hiện các truy vấn nhất định mà không có nó.
xem xét ví dụ sau đây. John
được sinh ra ở một số địa điểm, Location1
, vào ngày đầu tiên năm 1990, nhưng được đăng ký lần đầu được sinh ra vào thứ năm.
Bảng cơ sở dữ liệu, Persons
, bây giờ trông như thế này:
+----------+--------------+------------+----------+------------+----------+
| Name | Location | valid_from | valid_to | trans_from | trans_to |
+----------+--------------+------------+----------+------------+----------+
| John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 |99-99-9999|
+----------+--------------+------------+----------+------------+----------+
Tại thời điểm này, loại bỏ các cột trans_to
sẽ không gây ra quá nhiều rắc rối, nhưng giả sử như sau:
Sau vài năm , nói 20, John
chuyển đến Location2
và thông báo cho các quan chức 20 ngày sau đó. này sẽ làm cho cái nhìn Persons
bảng như thế này
+----------+--------------+------------+----------+------------+----------+
| Name | Location | valid_from | valid_to | trans_from | trans_to |
+----------+--------------+------------+----------+------------+----------+
| John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 |20-01-2010|
| John | Location1 | 01-01-1990 |01-01-2010| 20/01/2010 |99-99-9999|
| John | Location2 | 01-01-2010 |99-99-9999| 20/01/2010 |99-99-9999|
+----------+--------------+------------+----------+------------+----------+
Giả sử ai đó muốn tìm hiểu "Trường hợp nào thì hệ thống nghĩ rằng John đang sống bây giờ" (thời gian giao dịch), không phân biệt nơi ông thực cuộc sống. Điều này có thể (khoảng) được truy vấn trong SQL theo cách sau
Select Location
From Persons
Where Name = John AND trans_from > NOW AND trans_to < NOW
Giả sử thời gian kết thúc giao dịch đã được gỡ bỏ
+----------+--------------+------------+----------+------------+
| Name | Location | valid_from | valid_to | trans_from |
+----------+--------------+------------+----------+------------+
| John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 |
| John | Location1 | 01-01-1990 |01-01-2010| 20/01/2010 |
| John | Location2 | 01-01-2010 |99-99-9999| 20/01/2010 |
+----------+--------------+------------+----------+------------+
Truy vấn trên là tất nhiên không còn giá trị, nhưng làm cho logic cho cùng truy vấn trong bảng cuối cùng sẽ hơi khó. Vì thiếu trans_to
, nó sẽ phải được lấy từ các hàng khác trong bảng. Ví dụ: thời gian trans_to
tiềm ẩn cho hàng đầu tiên (vì mục nhập cũ nhất của nó) là số trans_from
từ hàng thứ hai, là hàng mới hơn của hai hàng.
Giao dịch kết thúc thời gian là do một trong hai 9999-99-99
, nếu hàng là mới nhất, hoặc đó là trans_from
từ hàng ngay lập tức thành công nó.
Điều này có nghĩa là dữ liệu liên quan đến một hàng cụ thể, không được lưu giữ hoàn toàn trong hàng đó và các hàng tạo thành sự phụ thuộc lẫn nhau, tất nhiên là không mong muốn. Hơn nữa, có thể khó xác định hàng chính xác nào là hàng kế tiếp của một hàng, điều này có thể làm cho các truy vấn phức tạp hơn nữa
đơn giản: cả hai dữ liệu đều ở cùng hàng, dễ dàng hơn để thực hiện các hoạt động của bạn – valentin
Trong trường hợp chỉ có một hàng, transactionEnd không được xác định rõ ràng có thể là giá trị mặc định – valentin