この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 9362|答える: 0

[出典] MySQLデータベースの鉄則

[リンクをコピー]
掲載地 2019/10/10 14:00:44 | | |
良いデータベース仕様は、ソフトウェア実装の複雑さを軽減し、通信コストを削減するのに役立ちます。

1. 倉庫建設の鉄則

-
鉄の法則
レベル
所見
文字集合
UTF-8を使いましょう。 絵文字が保存されている場合は、保存にはutf8mb4を使ってください。
強制的

ソートルール
utf8_general_ci
強制的

2. 表構成の鉄則

-
鉄の法則
レベル
所見
釈義
フィールドアノテーションを必ず用意してください。
強制的

エンコードする
UTF-8を使いましょう。 絵文字が保存されている場合は、保存にはutf8mb4を使ってください。
強制的

その場が概念的かどうか
名前はis_xxでなければならず、データ型は符号なしのtinyint(1 yes, 0 no)です。例:is_deleted(1 delete, 0 not deleted)。
強制的
負でなければ、任意のフィールドは符号なしでなければなりません
テーブル名、フィールド名
使用可能なのは小文字のアルファベット、アンダースコア、または数字のみです。 下線や数字で始めることは禁止されています。 2つのアンダーラインの間には数字のみが禁止されています。 保留語を無効にすること; テーブル名での複数形名詞の使用は禁止されています。
強制的

データベース名とテーブル名の命名
データベース名はアプリケーション名と一致し、テーブル名はテーブルのビジネスName_Roleで名付けられるべきです。
強制的

インデックス命名
プライマリキーインデックスはフィールド名pk_使います。 フィールド名uk_一意インデックス; 通常のインデックスはidx_フィールド名を使用します。
強制的
pk_が主キーです。 uk_は一意鍵です。 idx_ はインデックスです
十進分類
データ型は10進数であり、floatやdoubleの使用は禁止されており、floatとdoubleは精度が失われます。保存されるデータ範囲が10進数の範囲を超える場合は、整数と10進数に分割して別々に保存することが推奨されます。
強制的

ヴァルチャータイプ
varcharは可変長文字列で、事前にストレージ容量が割り当てられていません。長さは5000文字を超えてはいけません。5000文字を超える場合はテキストを適用します(別のテーブルを作成し、プライマリキーを対応させて他のフィールドのインデックス効率に影響しないようにしてください)。
強制的

テーブル名には3つのフィールドが必要です
id(データ型は符号なしbigint、単一のテーブルインクリメント、ステップサイズは1)、gmt_create、gmt_modified(アクティブ作成時間、パッシブ更新時間、データ型はdatetime)。
強制的

フィールド冗長性
フィールドは適切な冗長性を許容しますが、データの一貫性を考慮し、冗長フィールドは1) 頻度の低い修正を持つべきです。 2) ヴァルチャーの超長フィールドではなく、ましてやテキストフィールドではありません。
おすすめ

データベースとテーブルを分割する
パーティショニングは、単一テーブルの行数が500万行を超える場合、または単一テーブルの容量が2GBを超える場合にのみ推奨されます。
おすすめ


適切な文字容量を設定することで、データベースのテーブル容量やインデックスストレージを節約するだけでなく、何よりも検索速度が向上します。

3. 指数鉄則の確立

-
鉄の法則
レベル
所見
ユニークインデックス
ビジネスにおいて独自の特徴を持つフィールドは、たとえ複数のフィールドの組み合わせであっても、一意にインデックス化されなければなりません。 ユニークなインデックスはインサート速度に影響を与えますが、この損失は無視できる程度であり、クエリ速度を大幅に向上させます。 さらに、アプリケーション層が非常に完全なチェック制御を持っていても、一意インデックスが存在しない限り、マーフィーの法則によれば、必ず汚れたデータが生成されます。
強制的

参加
3つ以上のテーブルでは結合が禁止され、結合が必要なフィールドは禁止され、データ型は一貫していなければなりません。 複数のテーブルにクエリが関連付けられている場合、関連するフィールドにインデックスが必要であることを確認してください。 たとえダブルテーブルジョインがあっても、テーブルのインデックス作成やSQLのパフォーマンスに注意してください。
強制的

ヴァーチャーフィールド
インデックス長は指定しなければならず、すべてのフィールドをインデックスする必要はなく、実際のテキストの区別に従ってインデックス長を決定すればよい。 インデックス長と区別は矛盾の一組であり、一般的に文字列タイプデータでは、長さ20のインデックスは90%を超える区別度を持ち、これはカウント(左(列名、インデックス長))/カウント(*)の区別度によって決定されます。
強制的

ページ検索ではぼかしは禁止されています
ページ検索ではぼかしや完全なぼかしを禁止しています。必要なら検索エンジンで解決してください。 禁止理由:インデックスファイルはBツリーの最左端のプレフィックスマッチング特性を持ち、左側の値が決定されていなければ、このインデックスは使用できません。
強制的

順序は
シナリオごとに順序があるなら、指数の秩序性に注意してください。 順序の最後のフィールドは結合インデックスの一部であり、file_sortを防ぎクエリ性能に影響を与えるためにインデックスの組み合わせ順序の末尾に配置されます。 例:a=はどこですか? そして b=? 順番はc; 指数はa_b_cとして構築されるべきです。 反例として、インデックスにレンジルックアップがある場合、インデックスの順序性は利用できません。例えば、a>10はbによる順序です。 インデックスa_bはソートできません。
おすすめ

4. SQLの鉄規を書く

-
鉄の法則
レベル
所見
カウント(*)
count(列名)やcount(constant)をcount(*)の代わりに使わないでください。これらはSQL92で定義される行数の標準的な構文で、データベースに依存しず、NULLや非NULLにも独立しています。 count(*)はNULL値の行をカウントしますが、count(column name)はこのNULL列の行をカウントしません。
強制的

伯爵(区別されたコル)
NULLを除く列の一意行数をカウントします。 count(distinct col1, col2)では、ある列がすべてNULLの場合、もう一方の列が異なる値でも0を返します。
強制的

Sum(col)
列の値がすべてNULLの場合、count(col)は0を返しますが、sum(col)はNULLを返すため、sum()を使う際はNPEの問題に注意する必要があります。 NPE問題は以下の方法で回避できます:if(isnull(sum(g)), 0, sum(g)) をテーブルから選択;
強制的

isnull
isnull() を使って、それが NULL 値かどうかを判定します。 NULLは任意の値と比較してNULLです。
強制的

ページネーションクエリロジック
カウントが0の場合は、次のページ割り当て文を実行せずに直接返すべきです。
強制的

外側の鍵とカスケード
外部鍵の使用やカスケード処理は禁止されており、すべての外部鍵の概念はアプリケーション層で解決しなければなりません。 理由:外部鍵やカスケードは分散型の高並行性クラスタには適さず、カスケード更新は強力なブロッキングとなり、データベースの更新嵐のリスクがあり、外部鍵はデータベースの挿入速度に影響を与えるためです。
強制的

ストアドプロシージャ
ストアドプロシージャの使用は禁止されており、ストアドプロシージャはデバッグやスケールが難しく、移植性もありません。
強制的

データ訂正
データの修正(特にレコードの削除や修正)時は、誤って削除しないようにまず選択し、更新文が正しいことを確認するまで実行しないでください。
強制的

において
避けられない場合は、その後の集合要素の数を1000以内に制御すべきです。
おすすめ

切り詰め表
truncateテーブルの使用は禁止されており、deleteよりも速くシステムやログリソースを節約できますが、truncateはトランザクションを伴わずトリガーをトリガーしないため、事故を引き起こす可能性があるため、開発コードではこの文を使用しないでください。
参考


5. ORMは鉄の法則をマッピングします

-
鉄の法則
レベル
所見
テーブルクエリ
*をクエリに使うことが禁止されているフィールドのリストには、どのフィールドが必要か明確に示さなければなりません。
強制的

ポジョ
POJOクラスのブール属性はisに追加できず、データベースフィールドはisに追加しなければならず、結果マップ内のフィールドと属性間のマッピングが必要です。
強制的

返還パラメータ
resultClassをリターンパラメータとして使用することは禁止されており、すべてのクラス属性名がデータベースフィールドに対応していても定義する必要があります。 さらに、各テーブルに対応する属性を持たなければなりません。 理由:マッピング関係をDOクラスとフィールドを結合させてメンテナンスを容易にする設定です。
強制的

返還パラメータ
HashMapやHashTableをクエリ結果セットの出力として直接使用することは禁止されています。 理由:属性値の種類が制御不能だからです。
強制的

sql.xml パラメータの設定
sql.xml 設定パラメータには#{}、#param#を使用し、${}はSQLインジェクションに影響しやすいため使わないでください。
強制的

queryForList
Mybatisに付属しているqueryForList(String statementName, int start, int size)の使用は禁止されています。 理由は、データベース内のステートメントNameに対応するSQL文のすべてのレコードを取得し、subListを使ってstart、sizeのサブセットを取得することで実装されているからです。
強制的

更新時間
データベーステーブルレコードを更新する際は、同時にレコードの修正時間も更新する必要があります。
強制的

データベーステーブルレコードの更新
大規模かつ完全なデータ更新インターフェース(POJOクラスとして渡される)を書かないでください。 SQLを実行する際は、エラーが起こりやすく非効率的かつビンログの容量が増えるため、未変更のフィールドは更新しないでください。
おすすめ

@Transactional
@Transactional 取引を乱用しないでください。 トランザクションはデータベースのQPSに影響を与えます。 さらに、トランザクションを使用する場合は、キャッシュロールバック、検索エンジンロールバック、メッセージ補償、統計的補正などロールバックスキームのさまざまな側面を考慮する必要があります。
参考

Mybatis 動的SQLタグ
isEqual< compareValue>は属性値に対する定数であり、通常は数値で、対応するSQL文が等しい場合に実行されることを示します。 < isNotEmpty>は空でない、またはnullでないときに実行されることを示します。 < isNotNull>は、nullでないときに実行されることを示します。
参考








先の:SEO運用マップはネットワーク全体で初めてのもので、超完全なインターネット高精細運用マップのコレクションです
次に:[地球科学] DK子供百科事典 イギリス発の高品質な百科事典...
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com