データの正規化に関する記事や議論がたくさんあります。ほとんどの場合、人々は正規化するのがかなり難しいと思っていますが、必ずしもそうではありません。ケースバイケースのようですので、私はそのケースについて説明します。それは複雑に見えませんが、私はちょうどエレガントなものを欠いているような気がします。私たちのデータを正規化しないと価値がありますか?
- は私が検討しているデ - 正規化されたアイデアをサポートする私を与える、または溶液の特定のソリューションや種類で私を指す、または
- :誰かがどちらかできれば、私は大好きです。
主なことは、ユーザーが検索フィールドにテキストを入力したときに結果に近い検索を行い、結果が非常に敏感である必要があることです。しかし、非常に低電力のハードウェア - 私は思う。検索では、個々のアイテム名、バンドル名、および見つかったバンドル内の個々のアイテムのリストを返す必要があります。アイテムとバンドルには多対多の関係がありますが、バンドル内のアイテムの数は限られていますが、そのためには限界があります。
Ex DB:
[ items ]
int: item_id
string: name
….
[ bundles ]
int: bundle_id
string: bundle_name
….
[ items_x_bundles ]
int: item_id
int: bundle_id
は、与えられたバスケットの組み合わせで10の項目、たとえば、より一般的にこれ以上で、ギフトのバスケット内の食品の異なるバンドルを想像しますが、絶対的な固定制限はありません。新しいバンドルはめったに作成されず、決して変更されません。
など、様々な個々の項目があるとしましょう:
apple, orange, pear, banana, saltines, cheez-its, ritz,
potato chips, carrots, peas, beans, oreos, gummies,
hershey bars, coke, gatorade, milk, etc.
は、そのようにバンドル、:
special : [ apple, saltines, peas, gummies, coke ],
deluxe: [ pear, carrots, potato chips, oreos ],
fancy: [ orange, ritz, beans, gummies, milk ],
mondo: [ banana, pear, saltines, carrots, peas, oreos, coke, milk ]
"delu" の検索が返されます:
[ deluxe: [ pear, carrots, potato chips, oreos ]
を
「appl」を検索すると、返されます。
[ apple ]
[ special : [ apple, saltines, peas, gummies, coke ] ]
「ミルク」の検索が返されます:
[ milk ]
[ fancy: [ orange, ritz, beans, gummies, milk ]
[ mondo: [banana, pear, saltines, carrots, peas, oreos, coke, milk ]
我々は完全に正規化されたデータを保持する場合、それはすべての中で、個々の項目のリストを返すために、個々の項目名を見つけるのは簡単だが、はるかに複雑検索文字列を含むバスケット。ここでも低消費電力のIoTハードウェアで動作するため、効率が重要です。それが重要な場合は、sqlite3を使用します。
バンドルを作成するときにBundleテーブルにフィールドを追加することが考えられます。以下のような何か:
[特別]のためのようになりますstring: bundle_items
:これは、はるかに高速/簡単にすべてが冗長性を犠牲にして検索することができます
"apple/saltines/peas/gummies/coke".
。それは私の "ハック"のように感じますが、私は明らかにエレガントで効率的なソリューションを見ていません。
UPDATE
私はこの1つだけに5つのアップデート/反復を圧縮しています。
おそらく私はこれまでのようにはっきりしていなかったかもしれませんが、パフォーマンスの問題は本質的なものです。低消費電力のIoTグレードのハードウェア、入力された各文字でデータを検索する必要のあるユーザ向けのリアルタイムフィルタ。どのように構造化しても、望みどおりの速さではないでしょう。何らかの遅れがユーザに直接気付かれることもあります。私はハード・ナンバーを持っていません。なぜなら、デベロッパー・マシンでベンチマーク・シミュレーションを実行するのはかなり簡単です。実際のハードウェアではそうではありません。これは、No Matter Whatを逆正規化/最適化する必要があることを意味しますか?おそらく、私は実際にはこれをまだ知っていないので、ここでの質問です。さらに、私が検討している特定の逆正規化方法(上記)に関して憂慮すべき問題があるかどうかは疑問です。
標準化されていないデータをどのようにクエリするのか分かりますが、正規化されたデータに対してスマートで合理的に最適化されたクエリを構成する方法はわかりません。それは私たちの決定を導くのに役立つでしょう。だから:
質問#1)上記の結果を得るために、正規化されたデータのスマート(高速)クエリはどうでしょうか?
質問#2)誰も私が記述した正規化解除方法で目障りな問題を見ていますか?説明されている文脈の中で、それは理にかなっていますか?
カップルが通過した後、Bill Karwinの質問がうまく機能するので、答えは1つです。ありがとうございます。パート2は最終的に別の質問に終わることがあります。
誰かがフォローしている場合、さまざまな種類のクエリの実際の割合の差は、率直に私たちが深く掘り下げて調べる必要があるほど大きく(レコード数によって異なる)それが違うのは驚きではありませんが、その量は驚異的です。不合理な数のレコードではなく、約15xから35,000xを超えています。現実世界に近いかもしれない15倍であっても、私たちは正規化解除に傾いていると思いますが、これはテストするために正常に動作する正規表現を与えました。
非正規化は、パフォーマンスの問題に対処するために使用できる戦略です。あなたはクエリやパフォーマンスの問題について話していないので、あなたが持っているかどうかわからないと仮定しなければなりません。標準化されたデータベース設計には利点があり、データの整合性、保守性などを考慮して設計することが望ましいでしょう。だから、あなたの状況の非正規化についての考え方は、まったく時期尚早です。あなたがこの戦略を考えているかもしれない問題があるかどうか分からないからです。 – scottb
確かに、私は哲学を理解しています、私はこの特定のケースについて疑問に思っています。 (申し訳ありませんが、編集、1分...) –
明らかにコメントを編集するために5分の時間制限があります!私の反応はコメントのために少し長いので、元の質問を更新します。 –