[必須][スタイル] テーブル名の命名規則
説明
データベース内(物理&論理)のテーブル名命名規則:
OceanBase データベース MySQL Modeの一般的な規則
- 英小文字、数字、アンダースコアで構成され、英小文字で始まり、英小文字または数字で終わる。
- 長さが3文字以上(開発規則)で、データベースのテーブル名の最大制限文字数より少ないこと。
- OceanBase データベース MySQL Modeに存在するキーワードや予約語で命名しないこと。
注意
OceanBase データベース MySQL Modeの現在のテーブル名の最大文字数は64文字です。バージョンによっては制限が異なる場合があります。
OceanBase データベース Oracle Modeの一般的な規則
- 英文字、数字、アンダースコアで構成され、英大文字で始まり、英大文字または数字で終わる。
- 文字数が3文字以上(開発規則)で、データベースのテーブル名の最大制限文字数より小さいこと。
- OceanBase データベース Oracle Modeに存在するキーワードや予約語で命名しないこと。
注意
- OceanBase データベース Oracle Modeの規則は、英大文字/小文字の要件を除き、その他は OceanBase データベース MySQL Modeの規則と同じです。
- OceanBase データベース Oracle Modeの現在のテーブル名の最大文字数は64文字で、バージョンによっては制限が異なる場合があります。
一時テーブル
一時テーブルは
tmp_というプレフィックスを付けて作成します。補足シナリオの説明
リソース名の命名では、関連する依存関係の制約と不必要な曖昧さの回避を考慮する必要があります。
注意
曖昧さとは、リソース名が規則に合致しているものの、複数の解釈が可能な状況を指します。例えば、
tmp_で始まるテーブルは通常のテーブルと見なすことも、一時テーブルと見なすこともできますが、このような状況は避けるべきです。
エラーコードの例
エラー例1:OceanBase データベース MySQLのテーブル名命名規則に準拠していない場合
1tb:数字で始まるため、英小文字で始まる規則に違反しています。中文table:テーブル名に漢字が含まれており、「英小文字、数字、アンダースコアで構成される」という規則に違反しています。tb:文字数が3文字未満で、「文字数が3~64文字」という規則に違反しています。userTable:テーブル名に英大文字が含まれており、「英小文字、数字、アンダースコアで構成される」という規則に違反しています。user_:テーブル名がアンダースコアで終わっており、「英小文字または数字で終わる」という規則に違反しています。primay:primayはMySQLのキーワードであり、「OceanBase データベース MySQL Modeに存在するキーワードや予約語で命名する」という規則に違反しています。
エラー例2:OceanBase データベース Oracle Modeのテーブル名命名規則に準拠していない場合
user_table:テーブル名に英小文字が含まれており、「英大文字、数字、アンダースコアで構成される」という規則に違反しています。
[必須][スタイル] インデックス命名規則
説明
データベースのインデックス命名規則:
OceanBase データベース MySQLモードのインデックス命名規則
- インデックスは英小文字、数字、アンダースコア
_で構成されます。通常インデックスはidxで始まり、一意インデックスはukで始まります。 - インデックス名はデータベース自体の文字数制限を超えてはなりません。
- インデックス名は業務上分かりやすいものとし、含まれる列名または列名の適切な略称に区切り文字
_を加えて構成することを推奨します。
注意
現在のMySQLおよびOceanBaseデータベースMySQLモードの主流バージョンでは、インデックスの最大文字数は64文字です。バージョンによって異なる場合があります。
- インデックスは英小文字、数字、アンダースコア
Oracle、OceanBase データベース Oracleモードのインデックス命名規則
- インデックスは英大文字、数字、アンダースコア
_で構成されます。通常インデックスはIDXで始まり、一意インデックスはUKで始まります。 - インデックス名はデータベース自体の文字数制限を超えてはなりません。
- インデックス名は業務上分かりやすいものとし、含まれる列名または列名の適切な略称に区切り文字
_を加えて構成することを推奨します。
注意
現在のOceanBaseデータベースOracleモードの主流バージョンでは、インデックスの最大文字数は64文字です。バージョンによって異なる場合があります。
- インデックスは英大文字、数字、アンダースコア
エラーコード例
エラー例1:OceanBaseデータベースMySQL Modeの通常インデックスがidxで始まっていない場合
index email_address(email,address)、通常インデックスがidxで始まっていません。エラー例2:OceanBaseデータベースMySQL Modeの一意インデックスがukで始っていない場合
unique index idx_email_address(email,address)、一意インデックスがukで始まっていません。idxで始めると曖昧さを招く可能性があります。エラー例3:OceanBaseデータベースMySQL Modeのインデックス名に業務上の意味がない場合
index idx_1(email,adress)、インデックス名に業務上の意味を持っていません。エラー例4:OceanBaseデータベースMySQL Modeの論理テーブル間でインデックス名が一致しない場合
インデックス名は一貫して
idx_email_addressである必要があります。論理テーブル user_[00-09] user_00 インデックス index idx_00_email_address(email,address); user_01 インデックス index idx_01_email_address(email,address); ... user_09 インデックス index idx_09_email_address(email,address);エラー例5:OceanBaseデータベースOracle Modeの同一SCHEMA内でのインデックス名衝突
10データベースシャーディング100テーブルシャーディングでは、同一の物理データベースシャーディング内に1つの論理テーブルの10個の物理テーブルが存在します。例えば、DB00データシャーディング内で、TB_00、TB_01...TB_09テーブルシャーディングのインデックスIDX_COLAが重複して衝突します。
CREATE TABLE DB[00-09].TB_[00-99]( COLA NUMBER, INDEX IDX_COLA("COLA"); ); //エラー例6:OceanBaseデータベースOracle Modeの単一データベースシナリオにおけるテーブル間のインデックス衝突
DBデータベースシャーディング内で、テーブルTB1とTB2のインデックス
IDX_COLAが重複して衝突します。CREATE TABLE DB.TB_A( COLA NUMBER, INDEX IDX_COLA("COLA"); ); CREATE TABLE DB.TB_B( COLA NUMBER, INDEX IDX_COLA("COLA"); );
正解コード例
正解例1:OceanBaseデータベースMySQL Modeの通常インデックス
index idx_email_address(email,address)、通常インデックスは、idxで始まり、インデックスに含まれる列email、addressと区切り文字_で構成されます。正解例2:OceanBaseデータベースMySQL Modeの一意インデックス
unique index uk_email_address(email,address)は、一意インデックスで、ukで始まり、インデックスに含まれる列email、addressと区切り文字_で構成されます。正解例3:OceanBaseデータベースMySQL Modeのインデックス名に含まれる列の略称
index idx_email_add(email,address)は、インデックスに含まれる列 address を add と略記されています。正解例6:OceanBaseデータベースOracle Modeの単一データベースシナリオ
インデックスにはテーブル名に関する情報を含めることで、テーブル間の衝突を回避できます:
CREATE TABLE DB.TBA( COLA NUMBER, INDEX IDX_TBA_COLA("COLA"); ); // テーブル1 COLAフィールドのインデックス CREATE TABLE DB.TBB( COLA NUMBER, INDEX IDX_TBB_COLA("COLA"); ); // テーブル2 COLAフィールドのインデックス
[必須][スタイル] テーブル&フィールドのComment備考
説明
テーブル作成時には、必ずテーブルのComment備考を記入する必要があります(必須)。また、必要な列についてもComment備考を記入することを推奨します。
エラーコード例
CREATE TABLE user_table (
id int,
name varchar(255),
address varchar(255),
city varchar(255)
)
正解コード例
CREATE TABLE user_table (
id int,
name varchar(255),
address varchar(255) comment 'アドレス',
city varchar(255)
) COMMENT = 'チケット関係者'
[必須][品質] OceanBaseデータベースの自動インクリメント列型はbigintまたはbigint unsignedのみを使用する必要があり、intの使用は禁止
説明
OceanBaseデータベースの自動インクリメント列は、毎回一定の区間値を取得します(本番環境では通常100万)。特定のシナリオにおいて、未使用の区間があるにもかかわらず、既存の区間を破棄して再度値を取得することがあり、これにより自動インクリメント列の値に「ジャンプ」が発生します。自動インクリメント列の値が枯渇する(型の上限値に達する)のを防ぐため、bigintまたはbigint unsignedの使用を強制しています。
自動インクリメント列で「ジャンプ」が観測される場合、そのトリガーとなるシナリオは以下の通りです:
- 2回のアクセスで対象となったパーティションが異なる
- プライマリサーバーの切り替え
- メジャーコンパクション
- 自発的に大きな自動インクリメント値が insert された
- insert on duplicate update(改善されています。updateで自動インクリメント列に新しい値を明示的に指定しない限り、ジャンプは発生しません)