[強制][スタイル] テーブル名の命名規則
説明
データベース内(物理的および論理的)のテーブル名の命名規則:
OceanBaseデータベースMySQLモードの一般的な規則
- 小文字、数字、アンダースコアで構成され、小文字で始まり、小文字または数字で終わる。
- 長さは3以上(開発規範)であり、データベースのテーブル名の最大文字数制限を下回る。
- OceanBaseデータベースMySQLモードに存在するキーワードや予約語と同じ名前にしない。
注意
OceanBaseデータベースMySQLモードでは、現在のテーブル名の最大長制限は64ですが、バージョンによって異なる制限がある場合もあります。
OceanBaseデータベースOracleモードの一般的な規則
- 大文字、数字、アンダースコアで構成され、大文字で始まり、大文字または数字で終わる。
- 長さは3以上(開発規範)であり、データベースのテーブル名の最大文字数制限を下回る。
- OceanBaseデータベースOracleモードに存在するキーワードや予約語と同じ名前にしない。
注意
- OceanBaseデータベースOracleモードの規則は、大文字と小文字の要件以外は、OceanBaseデータベースMySQLモードの規則と同じです。
- OceanBaseデータベースOracleモードでは、現在のテーブル名の最大長制限は64ですが、バージョンによって異なる制限がある場合もあります。
一時テーブル
一時テーブルは
tmp_プレフィックスを付けて構成されます。追加のシナリオの説明
リソースの命名には、関連依存関係の制限と、不必要な曖昧さを避けることを考慮する必要があります。
注意
曖昧さとは、リソースの命名が規則に従っているものの、複数の解釈が可能な状況を指します。例えば、
tmp_で始まるテーブルは通常のテーブルとして扱うことができますが、同時に一時テーブルと見なすこともできます。このような状況は避けるべきです。
エラーコードの例
エラー例1:OceanBaseデータベースMySQLのテーブル名の命名規則に適合しない
1tb:数字で始まるため、小文字で始まるという規則に違反します。ChineseTable:テーブル名に中国語の文字が含まれており、「小文字、数字、アンダースコアで構成される」という規則に違反します。tb:長さが3未満であり、「長さは3以上65文字未満」という規則に違反します。userTable:テーブル名に大文字が含まれており、「小文字、数字、アンダースコアで構成される」という規則に違反します。user_:テーブル名がアンダースコアで終わっており、「小文字または数字で終わる」という規則に違反します。primay:primayはMySQLのキーワードであり、「OceanBaseデータベースMySQLモードに存在するキーワードや予約語と同じ名前にする」という規則に違反します。
エラー例2:OceanBaseデータベースOracleモードのテーブル名の命名規則に適合しない
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シャードでは、同一物理データベース内に10個の論理テーブルの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万)を取得します。OceanBaseデータベースの一部のシナリオでは、まだ使い切られていない範囲を破棄して再取得するため、自動インクリメント列の値に「ジャンプ」現象が発生します。自動インクリメント列の値が枯渇する(型の制限である最大値に達する)ことを避けるため、bigintまたはbigint unsignedの使用を強制します。
自動インクリメント列を使用中に「ジャンプ」現象が観測される場合、そのトリガーとなるシナリオには以下のようなものがあります:
- 2回のアクセスが同一パーティションではない場合
- プライマリキーの切り替え
- マージ
- 主動的に大きな自動インクリメント値の挿入
- insert on duplicate update(これはすでに改善されており、updateで自動インクリメント列=新しい値を明示的に指定しない限り、ジャンプは発生しません)