sql >> データベース >  >> RDS >> MariaDB

MariaDBサーバー10.3での自動データバージョン管理

    MariaDB Server 10.3には、多くのアプリケーションの設計を容易にする非常に便利な新しい機能が付属しています。データのバージョン管理は、いくつかの観点から重要です。コンプライアンスにより、データの変更を保存する必要がある場合があります。分析クエリの場合、特定の時点のデータを確認し、監査の目的で、どのような変更がいつ行われたかが重要になる場合があります。また、テーブルが削除された場合、履歴からテーブルを回復することは非常に価値があります。 MariaDBサーバーには、SQL:2011標準の仕様に基づくSystem-VersionedTablesという名前の機能が含まれるようになりました。テーブルデータの自動バージョン管理を提供します。

    システムバージョンテーブルの概念を非常に簡単な例で説明し、それが何であるかを示します。まず、データベースとテーブルを作成しましょう。

    CREATE DATABASE Company; 
    
    CREATE TABLE Person (
      Id int(11) NOT NULL AUTO_INCREMENT,
      FirstName varchar(50) NOT NULL,
      LastName varchar(50) NOT NULL,
      Gender char(1) NOT NULL,
      DepartmentId int(11) NOT NULL,
      PRIMARY KEY (Id),
      CONSTRAINT con_gender CHECK (Gender in ('f','m')))
    WITH SYSTEM VERSIONING;

    テーブルの自動バージョン管理をオンにする最後のテーブルオプションWITHSYSTEM_VERSIONINGを除いて、以前とまったく同じように見えます。テーブルに行を挿入して、どのように機能するかを見てみましょう。

    MariaDB [Company]> INSERT INTO Person (FirstName, LastName, Gender, DepartmentId) VALUES ('Rasmus', 'Johansson', 'm', 1);
    Query OK, 1 row affected (0.002 sec)
    
    MariaDB [Company]> SELECT * FROM Person;
    +----+-----------+-----------+--------+--------------+
    | Id | FirstName | LastName  | Gender | DepartmentId |
    +----+-----------+-----------+--------+--------------+
    |  1 | Rasmus    | Johansson | m      |            1 |
    +----+-----------+-----------+--------+--------------+
    1 row in set (0.001 sec)

    そこに私はテーブルの1つの行としてあります。興味深い部分は、行を更新するときに始まります。部門を数回変更します。

    MariaDB [Company]> UPDATE Person SET DepartmentId = 2 WHERE Id = 1;                                      Query OK, 1 row affected (0.002 sec)
    Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0
    
    MariaDB [Company]> SELECT * FROM Person;
    +----+-----------+-----------+--------+--------------+
    | Id | FirstName | LastName  | Gender | DepartmentId |
    +----+-----------+-----------+--------+--------------+
    |  1 | Rasmus    | Johansson | m      |            2 |
    +----+-----------+-----------+--------+--------------+
    1 row in set (0.001 sec)
    
    MariaDB [Company]> UPDATE Person SET DepartmentId = 3 WHERE Id = 1;
    Query OK, 1 row affected (0.003 sec)
    Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0
    
    MariaDB [Company]> SELECT * FROM Person;
    +----+-----------+-----------+--------+--------------+
    | Id | FirstName | LastName  | Gender | DepartmentId |
    +----+-----------+-----------+--------+--------------+
    |  1 | Rasmus    | Johansson | m      |            3 |
    +----+-----------+-----------+--------+--------------+
    1 row in set (0.001 sec)

    ご覧のとおり、MariaDBサーバーは、通常どおり更新ごとに1つの変更された行があることを示していますが、1つが挿入されています。これは、バージョン管理のないテーブルには当てはまりません。更新するたびに、行の新しいバージョンが発生し、テーブルに挿入する必要があります。上記でもわかるように、通常のSELECTでは最新バージョンのみが表示されます。行のすべてのバージョンを表示するために、MariaDBサーバーは次の構文を提供します。

    MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME ALL;
    +----+-----------+-----------+--------+--------------+
    | Id | FirstName | LastName  | Gender | DepartmentId |
    +----+-----------+-----------+--------+--------------+
    |  1 | Rasmus    | Johansson | m      |            1 |
    |  1 | Rasmus    | Johansson | m      |            2 |
    |  1 | Rasmus    | Johansson | m      |            3 |
    +----+-----------+-----------+--------+--------------+
    3 rows in set (0.001 sec)

    行がいつ更新されたかを確認できるようにするために、自動バージョン管理によって作成された2つの非表示の列を含める必要があります。 Invisible Columnsisは、MariaDBServer10.3のもう1つのエキサイティングな新機能です。自動バージョン管理の非表示の列は、ROW_STARTとROW_ENDです。これらは、行のバージョンが有効であった/有効であった期間を定義します。

    MariaDB [Company]> SELECT *, ROW_START, ROW_END FROM Person FOR SYSTEM_TIME ALL;
    +----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
    | Id | FirstName | LastName  | Gender | DepartmentId | ROW_START                  | ROW_END                    |
    +----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
    |  1 | Rasmus    | Johansson | m      |            1 | 2018-05-03 07:21:12.386980 | 2018-05-03 07:22:29.188266 |
    |  1 | Rasmus    | Johansson | m      |            2 | 2018-05-03 07:22:29.188266 | 2018-05-03 07:22:47.596481 |
    |  1 | Rasmus    | Johansson | m      |            3 | 2018-05-03 07:22:47.596481 | 2038-01-19 03:14:07.999999 |
    +----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
    3 rows in set (0.000 sec)

    ここで興味深いのは、特定の日時でテーブルがどのように表示されたかを正確に取得するために、ポイントインタイムクエリを実行することです。 AS OF構文を使用してこれを行うことができます:

    MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME AS OF TIMESTAMP '2018-05-03 07:22:33';
    +----+-----------+-----------+--------+--------------+
    | Id | FirstName | LastName  | Gender | DepartmentId |
    +----+-----------+-----------+--------+--------------+
    |  1 | Rasmus    | Johansson | m      |            2 |
    +----+-----------+-----------+--------+--------------+
    1 row in set (0.001 sec)

    これは、システムバージョンのテーブルを少し垣間見ただけです。上記の例に加えて、パフォーマンス上の理由から、履歴を別々のパーティションに配置したり、バージョン管理から列を除外したりすることができます。

    システムバージョンのテーブルの詳細については、MariaDBのドキュメントをご覧ください。 MariaDBTX3.0ダウンロードの一部としてMariaDBServer10.3を入手してください–現在利用可能です。


    1. ビジネスロジック:データベースまたはアプリケーション層

    2. OracleSequencenextvalは数を前後にジャンプしています

    3. ORACLE_HOMEのクローン

    4. ピボットテーブルと連結列