[必須][スタイル] テーブル名の命名規則
説明
データベース内の(物理的および論理的な)テーブル名の命名規則:
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ステートメントで自動インクリメント列に新しい値を明示的に指定しない限り、ジャンプは発生しません)