一意のURL-frinedlyルート、 ループは、私は、この構造でmariadbのテーブルを持っている
CREATE TABLE `items` (
`id` char(36), `route` varchar(255), `value` text,
PRIMARY KEY (`id`),
UNIQUE KEY `route` (`route`)
)
は、私は、ユーザーfriendy URLを取得するために
route
列を使用、など
http://www.examle.com/this-is-the-route-of-an-item
生成しますユーザーは空白や違法な文字を除いて、新しいアイテムを作成します。新しいアイテム用に選択されたルートが使用されているケースを「キャッチ」し、有効なルートを生成したいと思います。例えば
route-of-an-item
が既に使用中である場合、iはroute-of-an-item-a
、またはroute-of-an-item-b
へのフォールバックであろうが、等
ナイーブ溶液(擬似コードの一種)は、例えば、ループ内のDBを照会することができる:
var additionalChars = "";
while (db.query("select count * from `items` where `route`='" + route + "-" + additionalChars + "'"))
additionalChars = nextAdditionalChars(additionalChars);
finalRoute = route + '-' + additionalChars;
これは、何度もデータベースにクエリすることを伴うので、私は別の解決策を考えました。
var additionalChars = "";
var usedRoutes = db.query("select `route` from `items` where `route` like '" + route + "%'");
while(usedRoutes.contains(route + '-' + additionalChars))
additionalChars = nextAdditionalChars(additionalChars);
finalRoute = route + '-' + additionalChars;
このような問題にアプローチする方法はありますか?
私は、2番目のソリューションの方が優れていると修正しましたか?
2番目のソリューションを使用する場合は、フルテキストインデックスを追加する必要がありますか?
の終わりにapears以来
とフルテキストインデックスは必要ありませんか? –
あなたはそれを挿入し、dbの一意のインデックス例外をキャッチしようとすることができます。変更してもう一度やり直してください。あなたが成功に達するまで繰り返す。 – ojf
@TimBiegeleisen定義されていません。これはちょうどpesudoコードです。 – MoLow