有理数としてネイティブに提供されるデータを扱っています。このデータを C# で美しく表現し、他の多くの形式に変換できる洗練されたジェネリック C# クラスがあります。残念ながら、振り返ってこれを SQL に保存したい場合、いくつかの解決策を念頭に置いていますが、どれも満足のいくものではありません。
ここに例があります。C# で簡単に処理できる生の値2/3
があります。new Rational<int>(2, 3)
これをデータベースに保存するために考えたオプションは次のとおりです。
10 進数/浮動小数点、つまり
0.66666667
さまざまな精度と正確さの値 = と同じです。 長所:これにより、データのクエリが可能になります。たとえば、値 < 1 を検索できます。 短所:正確さが失われ、この単純な値を UI に表示しようとすると見苦しくなります。2
分子 = 、分母 =3
など、さまざまな精度と正確 さの2 つの正確な整数フィールドとして格納します。長所:これにより、元の値を正確に表現し、後で最も単純な形式で表示することができます。 短所:この値を表す 2 つのフィールドがあり、すべてのクエリで算術演算を実行する必要があるため、クエリが複雑になり、効率が低下します。たとえば、分子/分母 < 1 を検索します。文字列データとしてシリアル化します
"2/3"
。最大文字列長を知ることができ、これを保持できる varchar を持つことができます。 長所: 1 つのフィールドに戻ってきましたが、正確な表現があります。 短所:クエリはほとんど機能せず、シリアル化のコストがかかります。1号と2号の組み合わせ。 長所:値の範囲を簡単かつ効率的にクエリし、UI に正確な値を表示します。 短所: 1 つのデータを保持するための 3 つのフィールド (!?!) は、DRY を壊す複数の表現を同期させなければなりません
1号と3号の組み合わせ。 長所:値の範囲を簡単かつ効率的にクエリし、UI に正確な値を表示します。 短所: 1 つのデータを保持するために 2 つのフィールドに戻り、複数の表現を同期して維持する必要があるため、DRY が壊れ、追加のシリアル化コストを支払う必要があります。
これらよりも優れた別のすぐに使えるソリューションを持っている人はいますか? 他に考慮していないことはありますか?私が知らないSQLでこれを行う比較的簡単な方法はありますか?