postgresの同じ列内に異なるデータ型を保存する正しい方法はありますか?

K. Niemczyk

私は現在、postgresデータベースと相互作用する既存のAPIを変更しようとしています。簡単に言うと、これは基本的に記述子/メタデータを格納して、実際の「資産」(通常はある種のファイル)がサーバーのハードディスクのどこに格納されているかを判別します。

現在、これらの「アセット」に任意の数の未定義のキーと値のペア(つまり、uploadedBy、addedOn、assetTypeなど)を「タグ付け」することができます。これらのタグは、次のような構造の別のテーブルに格納されます。

+---------------+----------------+-------------+
|assetid (text) | tagid(integer) | value(text) |
|---------------+----------------+-------------|
|someStringValue| 1234           | someValue   |
|---------------+----------------+-------------|
|aDiffStringKey | 1235           | a username  |
|---------------+----------------+-------------|
|aDiffStrKey    | 1236           | Nov 5, 1605 |
+---------------+----------------+-------------+

Assetidとtagidは、他のテーブルからの外部キーです。ファイルを表すassetidについて考えてみてください。タグIDと値のペアは、記述子のマップです。

現在、API(Javaにあります)は、これらすべてのキーと値のペアをMapオブジェクトとして作成します。これには、タイムスタンプ/日付などが含まれます。私たちがやりたいのは、キーと値のペアの値について、さまざまなタイプのデータを何らかの方法で格納できるようにすることです。または、少なくとも、データベース内に別の方法で保存して、必要に応じて、これらのタグの日付範囲などをチェックするクエリを実行できるようにします。ただし、それらがテキストアイテムとしてデータベースに保存されている場合は、a。)これが実際には日付/時刻/タイムスタンプアイテムであることを認識し、b。)実際にそのようなを実行できるものに変換する必要があります。クエリします。

データベースのレイアウトをあまり変更せずに、これまで考えられたアイデアは1つだけです。

アセットタグテーブル(上記)を展開して、さまざまなタイプ(数値、テキスト、タイムスタンプ)の追加の列を作成し、それらをnullにできるようにしてから、挿入時に、対応する「キー」をチェックして、データのタイプを特定します。本当にそうです。しかし、そのような実装には多くの問題があります。

そこにあるPostgreSQL-Ninjaは、この問題に取り組む方法についての提案を提供できますか?私は最近、データベースの相互作用の最深部に戻されたばかりなので、少し錆びていることを認めます。

ボヘミアン

基本的に2つの選択肢があります。

オプション1:スパーステーブル

データ型ごとに1つの列を用意しますが、保存するデータ型に一致する列のみを使用してください。もちろん、これによりほとんどの列がnullになり、スペースが無駄になりますが、強い型付けのため、純粋主義者はそれを好みます。どのデータ型が適用されるかを判断するために、各列でnullをチェックする必要があるのは少し不格好です。また、実際にnullを格納したい場合は、残念です。「nullを意味する」特定の値を選択する必要があります。

オプション2:2つの列-1つはコンテンツ用、もう1つはタイプ用

すべてをテキストとして表現できるため、値にテキスト列を設定し、型に別の列(intまたはtext)を設定して、アプリコードが正しい型オブジェクトに正しい値を復元できるようにします。nullがあまりないのは良いことですが、重要なのは、値をjsonとして、型をクラス名として格納することで、SQLデータ型を超えてアプリケーションクラスに型を簡単に拡張できることです。

私はキャリアの中でオプション2を数回使用しましたが、それは常に非常に成功しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じデータドキュメントをfirestoreの2つの異なるコレクションに追加する正しい方法はありますか?

分類Dev

異なるデータ型の列を参照する方法はありますか?

分類Dev

データベースで同じ名前のデータを取得する方法はありますが、phpを使用して作成者が異なりますか?

分類Dev

Rで同じデータを使用しながら、3列のデータフレームを2列に変換する方法はありますか?

分類Dev

SQLは同じ列からデータを収集し、結果が異なる可能性があります

分類Dev

Javaの同じ配列に文字列と整数を格納する「正しい」方法はありますか?

分類Dev

postgres配列のデータ型を伝える方法はありますか?

分類Dev

現在、jsonデータを文字列型の列に保存していますが、型をjsonにすることには利点がありますか?

分類Dev

Airflowは、同じデータ内の異なる時間にタスクを実行しますか?

分類Dev

異なるデータ型が同じデータに対してより多くのメモリを使用するのはなぜですか?

分類Dev

変数がリストであり、このリスト内のデータ型がすべて整数であることを確認する方法は、そうでない場合はそれに応じて例外をスローしますか?

分類Dev

チャートの同じバーに2つの異なる色を使用する方法はありますか?

分類Dev

列の10個のデータポイントごとに同じグラフの異なる線であるCSVファイルからデータをプロットする方法はありますか?

分類Dev

同じ行にある異なる列値に基づいてデータセットを選択します

分類Dev

同じ入力データ型に対して異なるデータ型を返すAPIを処理するにはどうすればよいですか?

分類Dev

複数の列に同じ値があり、別の値が異なるデータフレームから行を選択します

分類Dev

Kotlinのデータクラス内に列挙型をネストする方法はありますか?

分類Dev

graphvizのfdpレイアウトを使用して、同じクラスター内のノード間と異なるクラスター内のノード間で異なるエッジスプラインを使用する方法はありますか?

分類Dev

異なる列の同じデータを結合するにはどうすればよいですか?

分類Dev

リストまたは同様のデータ型を定義する方法はありますか。クラスに同じクラスの?

分類Dev

行に同じIDがあり、別の列に値が異なるデータをフェッチして、phpのテーブルに表示する方法

分類Dev

C ++で、データ型ごとに異なる実行パスを許可する方法はありますか?

分類Dev

より少ない要素数で同じ配列に配列をコピーする方法はありますか?

分類Dev

MSSQLの同じ照合列は異なるデータを表示します

分類Dev

同じデータテーブルに2つの異なる行(同じ列)を追加するのを手伝う必要があります

分類Dev

postgresの異なるレコードの同じテーブルに同じデータ(またはコピー)を挿入する方法

分類Dev

異なる行のデータが等しい場合に同じ列で正しい日付を選択する方法

分類Dev

同じ値の異なる `Rc`を区別する方法はありますか?

分類Dev

異なるデータをチェックする方法は同じ列です。ループのある名前

Related 関連記事

  1. 1

    同じデータドキュメントをfirestoreの2つの異なるコレクションに追加する正しい方法はありますか?

  2. 2

    異なるデータ型の列を参照する方法はありますか?

  3. 3

    データベースで同じ名前のデータを取得する方法はありますが、phpを使用して作成者が異なりますか?

  4. 4

    Rで同じデータを使用しながら、3列のデータフレームを2列に変換する方法はありますか?

  5. 5

    SQLは同じ列からデータを収集し、結果が異なる可能性があります

  6. 6

    Javaの同じ配列に文字列と整数を格納する「正しい」方法はありますか?

  7. 7

    postgres配列のデータ型を伝える方法はありますか?

  8. 8

    現在、jsonデータを文字列型の列に保存していますが、型をjsonにすることには利点がありますか?

  9. 9

    Airflowは、同じデータ内の異なる時間にタスクを実行しますか?

  10. 10

    異なるデータ型が同じデータに対してより多くのメモリを使用するのはなぜですか?

  11. 11

    変数がリストであり、このリスト内のデータ型がすべて整数であることを確認する方法は、そうでない場合はそれに応じて例外をスローしますか?

  12. 12

    チャートの同じバーに2つの異なる色を使用する方法はありますか?

  13. 13

    列の10個のデータポイントごとに同じグラフの異なる線であるCSVファイルからデータをプロットする方法はありますか?

  14. 14

    同じ行にある異なる列値に基づいてデータセットを選択します

  15. 15

    同じ入力データ型に対して異なるデータ型を返すAPIを処理するにはどうすればよいですか?

  16. 16

    複数の列に同じ値があり、別の値が異なるデータフレームから行を選択します

  17. 17

    Kotlinのデータクラス内に列挙型をネストする方法はありますか?

  18. 18

    graphvizのfdpレイアウトを使用して、同じクラスター内のノード間と異なるクラスター内のノード間で異なるエッジスプラインを使用する方法はありますか?

  19. 19

    異なる列の同じデータを結合するにはどうすればよいですか?

  20. 20

    リストまたは同様のデータ型を定義する方法はありますか。クラスに同じクラスの?

  21. 21

    行に同じIDがあり、別の列に値が異なるデータをフェッチして、phpのテーブルに表示する方法

  22. 22

    C ++で、データ型ごとに異なる実行パスを許可する方法はありますか?

  23. 23

    より少ない要素数で同じ配列に配列をコピーする方法はありますか?

  24. 24

    MSSQLの同じ照合列は異なるデータを表示します

  25. 25

    同じデータテーブルに2つの異なる行(同じ列)を追加するのを手伝う必要があります

  26. 26

    postgresの異なるレコードの同じテーブルに同じデータ(またはコピー)を挿入する方法

  27. 27

    異なる行のデータが等しい場合に同じ列で正しい日付を選択する方法

  28. 28

    同じ値の異なる `Rc`を区別する方法はありますか?

  29. 29

    異なるデータをチェックする方法は同じ列です。ループのある名前

ホットタグ

アーカイブ