資料庫中的時間概念
資料庫以關係的形式使用,用來模擬外部現實世界某一部分的狀態。一般來說,資料庫系統只儲存一個狀態,即現實世界的當前狀態,並且不保留關於先前和過去狀態的資料,除非有時作為審計跟蹤。如果現實世界的當前狀態發生變化,資料庫就會被編輯和更新,而關於先前狀態的知識就會丟失。
但是,在大多數現實世界的應用程式中,儲存和檢索關於先前狀態的資訊非常重要。例如,學生資料庫必須包含關於該學生過去學習成績的歷史資訊,以便準備最終成績。為了成功地採取行動,自主機器人系統必須保留關於當前和歷史環境感測器資料的知識。
以下是資料庫中使用時間的一些常見方法,以及使用與時間相關的功能的示例和語法:
時間戳
時間戳用於記錄特定記錄建立或修改的日期和時間。在大多數資料庫中,時間戳在記錄插入或更新時自動生成。
在 MySQL 中建立包含時間戳列的表的語法:
CREATE TABLE example_table ( id INT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
輸出表
+------------+--------------------------------------+ | Column | Type | +------------+--------------------------------------+ | id | INT | | created_at | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | +------------+--------------------------------------+ | PRIMARY KEY| (id) | +------------+--------------------------------------+
插入包含當前時間戳的記錄的示例:
INSERT INTO example_table (id) VALUES (1);
輸出表
+----+---------------------+ | id | created_at | +----+---------------------+ | 1 || +----+---------------------+
基於時間的分割槽
基於時間的分割槽用於在處理大型資料集時提高效能,方法是根據時間將資料分成更小、更易於管理的塊。
在 Apache Cassandra 中建立基於時間的表的分割槽表的語法:
CREATE TABLE example_table ( id INT, created_at TIMESTAMP, value TEXT, PRIMARY KEY ((id), created_at) ) WITH CLUSTERING ORDER BY (created_at DESC) AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS'};
輸出表
+------------+--------------+--------------------------------------------+ | Column | Type | Modifiers | +------------+--------------+--------------------------------------------+ | id | INT | PRIMARY KEY | | created_at | TIMESTAMP | PRIMARY KEY | | value | TEXT | | +------------+--------------+--------------------------------------------+ | CLUSTERING | ORDER BY | (created_at DESC) | +------------+--------------+--------------------------------------------+ | compaction | TimeWindow | {'class': 'TimeWindowCompactionStrategy', | | Strategy | 'compaction_window_size': '1', | | | 'compaction_window_unit': 'DAYS'} | +------------+--------------+--------------------------------------------+
這將建立一個表,其中資料按“id”分割槽,並按“created_at”聚類。資料也基於一天的時間視窗進行壓縮。
時區
在處理以不同時區記錄的資料時,必須根據需要正確轉換時區。
在 PostgreSQL 中將時間戳轉換為不同時區的語法:
SELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York' FROM example_table;
這將“created_at”時間戳轉換為東部時間區。
輸出表
+------------------------+ | timezone_adjusted_time | +------------------------+ | 2023-03-18 08:00:00-04 | | 2023-03-17 23:30:00-04 | | 2023-03-17 15:15:00-04 | | 2023-03-17 10:00:00-04 | +------------------------+
歷史資料
歷史資料用於跟蹤隨時間的變化。在大多數資料庫中,這是透過建立一個單獨的表來完成的,該表儲存對特定記錄所做的更改的歷史記錄。
在 SQL Server 中建立歷史表的語法:
CREATE TABLE example_table_history ( id INT, created_at TIMESTAMP, value TEXT, changed_at TIMESTAMP, changed_by TEXT );
這將建立一個單獨的表來跟蹤對“example_table”表所做的更改。每當“example_table”表中的記錄被修改時,都會在“example_table_history”表中新增一條新記錄,其中包含當前時間戳、進行更改的使用者以及記錄的舊值。
讓我們向表中插入一些值:
INSERT INTO example_table_history (id, created_at, value, changed_at, changed_by) VALUES (1, '2022-01-01 12:00:00', 'Value 1', '2022-01-02 12:00:00', 'User 1'), (2, '2022-02-01 12:00:00', 'Value 2', '2022-02-02 12:00:00', 'User 2'), (3, '2022-03-01 12:00:00', 'Value 3', '2022-03-02 12:00:00', 'User 3');
SELECT * FROM example_table_history;
輸出表
id | created_at | value | changed_at | changed_by ---|----------------------|---------|----------------------|------------ 1 | 2022-01-01 12:00:00 | Value 1 | 2022-01-02 12:00:00 | User 1 2 | 2022-02-01 12:00:00 | Value 2 | 2022-02-02 12:00:00 | User 2 3 | 2022-03-01 12:00:00 | Value 3 | 2022-03-02 12:00:00 | User 3
結論
總而言之,時間是資料庫中的一個重要概念,它以許多不同的方式使用。時間戳用於記錄特定記錄的建立或修改日期和時間,而基於時間的分割槽用於在處理大型資料集時提高效能。在處理以不同時區記錄的資料時,必須根據需要正確轉換時區。最後,歷史資料用於跟蹤隨時間的變化,通常儲存在單獨的表中。總的來說,瞭解時間在資料庫中使用的不同方式對於構建健壯且可擴充套件的應用程式至關重要。