[必須][スタイル] テーブル名の命名規則
説明
データベース内(物理&論理)のテーブル名命名規則:
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:数字で始まるため、小文字で始まる規則に違反します。中文table:テーブル名に中国語の文字が含まれており、「小文字、数字、アンダースコアで構成される」という規則に違反します。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モードの通常インデックスがidxで始まらない場合
index email_address(email,address)、通常インデックスがidxで始まりません。エラー例2:OceanBaseデータベースMySQLモードの一意インデックスがukで始まらない場合
unique index idx_email_address(email,address)、一意インデックスがukで始まりません。idxで始めると曖昧さを招く可能性があります。エラー例3:OceanBaseデータベースMySQLモードのインデックス名に業務上の意味がない場合
index idx_1(email,adress)、インデックス名に業務上の意味がありません。エラー例4:OceanBaseデータベースMySQLモードの論理テーブル間でインデックス名が一致しない場合
インデックス名は一貫して
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モードの同一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モードの単一データベースシナリオにおける異なるテーブル間のインデックス衝突
データシャーディング内で、テーブル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モードの通常インデックス
index idx_email_address(email,address)、通常インデックスで、idxで始まり、インデックスに含まれる列email、addressと区切り文字_で構成されます。正解例2:OceanBaseデータベースMySQLモードの一意インデックス
unique index uk_email_address(email,address)、一意インデックスで、ukで始まり、インデックスに含まれる列email、addressと区切り文字_で構成されます。正解例3:OceanBaseデータベースMySQLモードのインデックス名に含まれる列の略称
index idx_email_add(email,address)、インデックスに含まれる列 address を add と略称します。正解例6:OceanBaseデータベースOracleモードの単一データベースシナリオ
インデックスにはテーブル名に関する情報を含めることで、異なるテーブル間の衝突を回避できます:
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 on duplicate update(改善されています。updateで自動インクリメント列に新しい値を明示的に指定しない限り、ジャンプは発生しません)