23

SQLite3は、他の種類のSQLとは対照的に、静的型付けではなく動的型付けを使用します。SQLiteのWebサイトには次のように書かれています。

ほとんどのSQLデータベースエンジン(私たちが知る限り、SQLite以外のすべてのSQLデータベースエンジン)は、静的で厳密な型指定を使用します。静的型付けでは、値のデータ型はそのコンテナー(値が格納されている特定の列)によって決定されます。

SQLiteは、より一般的な動的型システムを使用します。SQLiteでは、値のデータ型は、コンテナーではなく、値自体に関連付けられています。

たとえば、文字列を整数列に格納できるので、これはまさにあなたが望まないことのように思えます。

ページは続きます:

... SQLiteの動的型付けにより、従来の厳密に型付けされたデータベースでは不可能なことが可能になります。

2つの質問があります:

  1. ユースケースの質問:SQLite3の動的型付けが有益な例は何ですか?
  2. 歴史的/設計上の質問:動的型付けでSQLiteを実装する動機は何でしたか?
4

2 に答える 2

11

これはSQLiteではタイプアフィニティと呼ばれます。

SQLiteのWebサイトによると、「SQLiteと他のデータベースエンジン間の互換性を最大化するために」これを行っています。(上記のリンクを参照)

SQLiteは、列の「タイプアフィニティ」の概念をサポートしています。列のタイプアフィニティは、その列に格納されるデータの推奨タイプです。ここで重要なのは、このタイプは必須ではなく推奨されるということです。どの列にも、あらゆるタイプのデータを格納できます。一部の列は、選択肢があれば、あるストレージクラスを別のストレージクラスよりも使用することを好むというだけです。列の優先ストレージクラスは、その「アフィニティ」と呼ばれます。

私の理解では、SQLiteはまさにその名前の由来であり、非常に軽量でミニマルなデータベースエンジンです。強い型付けに関連するオーバーヘッドはおそらくプロジェクトの範囲を超えており、SQLiteを使用するアプリケーションに任せるのが最善です。

しかし、繰り返しになりますが、彼らのWebサイトによると、他のDBエンジンとの互換性を最大化するためにこれを行っています。

于 2010-03-22T04:02:54.503 に答える
6

たとえば、Firefoxの「about:config」ページを見ると、これらの設定は実際にはSQliteデータベースに保存されていると思います(ただし、100%確実ではありません)。SQliteの動的型付けを使用する利点は、設定の各値を厳密に型指定できることです(たとえば、「alerts.totalOpenTime」設定は整数ですが、「app.update.channel」は文字列です)。タイプごとの列。

結局のところ、これはプログラミング言語の場合と基本的に同じ議論です。なぜ静的型付けよりもプログラミング言語で動的型付けを行うのでしょうか。

于 2010-03-22T03:57:59.990 に答える