2009-07-20 8 views
4

私はGoogle Tasksアプリケーションを複製して拡張しています。私は行の順序を格納できるようにしたい。 rowNumberという名前のデータベースにフィールドを作成しました。ユーザーが他の行の途中に行を挿入すると、このフィールドを他の多くの行で更新して、目的の出力を達成する必要があります。より良い方法がありますか?データベース内の行の間に注文を保存する最も良い方法は何ですか?

ところで、アプリケーションはGoogle App Engine(Python)用に作られています。

+1

行を1つ増やす必要がありますか?行を削除するとどうなりますか?残りの行にも番号を付け直しますか? –

+0

行は必ずしも1つ増分する必要はありません。私はあなたが取得したい場所を参照してください:インクリメントが高い場合、残りを更新せずに行を挿入することができます。 –

+0

行を削除すると、残りの部分が順序付けられたままになります。 –

答えて

3

rowNumberを浮動小数点数にします。ユーザーが列の間に挿入するとXは、新しい行がを取得し、Y ROWNUMBER =(x.rowNumber + y.rowNumer)/ 2.

あなただけのROWNUMBERを同じように更新し、行を移動したいとき目標位置に基づく。

新しい行にはrowNumberなどがあります。 MAX + 256.

編集Microsoftは、新しいHierarchyIdデータ型を使用してこれをSQL Server 2008で解決しました。 の2つの項目の間に、を何度でも挿入して、HierarchyIdの最大サイズを使い切るまで何回でも挿入できます。

+0

美しい! –

+2

これにはフロートの使用をおすすめしません。隣接する2つの値、つまりaとbに達する点を予測するのが難しくなります。つまり、(a + b)/ 2はaまたはbのいずれかと等しくなります。この状況を検出して特別なことをする必要があります。だから、浮動小数点数では256(またはそれ以上の数)の間隔で整数から始めることもできますし、整数型では、型の全範囲にわたって「均等に」値を配置するほうが簡単です。 –

+0

本当に、この状況は常に起こる可能性があります。同じ位置に50回挿入した後(高精度小数点以下をrowNumberとして使用)私はこれを無視した。あなたは限界を打つときに整数を使用し、テーブル全体を再計算する方が良いでしょう。 –

3

1つのオプションは、行をリンクリストとして格納することです。各行は、次の行と前の行の追加フィールドを保持します。これの上の面は、挿入後に2つの他の行に触れる必要があるということです。欠点は、AppEngineには結合がないので、一度に複数の行を照会するのはかなり醜いことです(理解しているとおり)。

+1

これはSQLでも醜いでしょうか? –

+0

これを照会することは可能ですが、それほど高速ではないかもしれませんが、そうですか? –

+0

はあなたの醜いSQLの考え方にかかっています。 SQLクエリは、1行の次の行を後続の行のpkと等しくする、束縛の束(戻りたい行の数より1少ない数)になります。速度は、DBMSがそのような種類のクエリを最適化する程度に依存します。 – SingleNegationElimination

関連する問題