1

私が抱えている問題は次のとおりです。私の会社のサプライヤから、製品情報を含むAccessデータベース(SQL Serverにインポート)が提供されており(代わりにXMLを使用することもできます)、これをより使いやすい形式に変換しようとしています。 eコマースWebサイトで使用します。

私が遭遇した問題、そしておそらく私がはっきりと考えていないのは、それらのカテゴリ情報が3〜6個のサブカテゴリの深さである可能性があることです。常に少なくとも2つのカテゴリ(最上位の親カテゴリとより具体的なサブカテゴリ)がありますが、アイテムによっては最大6つまで存在する可能性があります。

それらのデータは、次のテーブル構造で提供されます。

CREATE TABLE [dbo].[ECDB2_HIERARCHY](
    [SEQ_ID] [int] NOT NULL,
    [PFX_NUM] [nvarchar](3) NOT NULL,
    [STK_NUM] [nvarchar](12) NOT NULL,
    [ECDB2_LVL_1] [nvarchar](max)  NULL,
    [ECDB2_LVL_1_ID] [int] NULL,
    [ECDB2_LVL_2] [nvarchar](max) NULL,
    [ECDB2_LVL_2_ID] [int] NULL,
    [ECDB2_LVL_3] [nvarchar](max) NULL,
    [ECDB2_LVL_3_ID] [int] NULL,
    [ECDB2_LVL_4] [nvarchar](max) NULL,
    [ECDB2_LVL_4_ID] [int] NULL,
    [ECDB2_LVL_5] [nvarchar](max) NULL,
    [ECDB2_LVL_5_ID] [int] NULL,
    [ECDB2_LVL_6] [nvarchar](max) NULL,
    [ECDB2_LVL_6_ID] [int] NULL

ほとんどの場合、SEQ_IDは使用されていないため、無視できます。PFX_NUMとSTK_NUMは連結されて、製品のSKUを形成しますが、それは問題ではありません。サイトからカテゴリを動的にトラバースできる必要があります。たとえば、次の行があるとします。

SEQ_ID: 364867 (ignored)

PFX_NUM: AMP

STK_NUM: 73121

ECDB2_LVL_1: Office Supplies

ECDB2_LVL_1_ID 11

ECDB2_LVL_2: Envelopes, Mailers & Shipping Supplies

ECBD2_LVL_2_ID: 26

ECDB2_LVL_3: Envelopes

ECDB2_LVL_3_ID: 195

ECDB2_LVL_4: Business Letter Envelopes

ECDB2_LVL_4_ID: 795

ECDB2_LVL_5: (empty)

ECDB2_LVL_5_ID: 0

ECDB2_LVL_6: (empty)

ECDB2_LVL_6_ID: 0

ユーザーはレベルをナビゲートできるはずですが、データが提供されているサンプルWebサイト(以下を参照)は、サブカテゴリの下のすべてのアイテムをランダムな間隔で表示します...第3レベル(ecdb2_lvl_3)のように見えます)ただし、第3レベルがないアイテムの場合は、第2レベルから表示されます。スキーマからわかるように、自己参照カテゴリテーブルや結合製品テーブルのようなものではなく、製品とそれに属するすべてのカテゴリを一覧表示する1つのテーブルにすべてがまとめられています。

問題は、一部のアイテムには2つのレベルしかないことです。このようなアイテムには、最大4つのレベルがあり、6つすべてのアイテムがいくつかあります。ベンダーのサンプルWebサイトで、http://www.biggestbook.comから入手できます。私が望むことはうまくやっていますが、私は彼らのコードにアクセスできないので、彼らがカテゴリーをどれだけ正確に引き戻してトラバースしているかについて頭を悩ませています。彼らはあなたが現在どのレベルにいるのかを示す何らかのグローバルフラグを持っていると思います(たとえば、事務用品の場合は1、封筒の場合は2など)。これにより、現在の深度を追跡できます。次に、各サブレベルをチェックして、表示するサブカテゴリが他にもあるかどうかを確認しますが、これを効率的に処理する方法を考えると、空白を描画しています。それらの命名スキームにも多くの要望がありますが、必要に応じて後で取り組むことができます。

この問題に取り組む方法について誰かアドバイスがありますか?私はC#/ ASP.NET(おそらくMVC、おそらくそうではない)でストアを計画しているので、C#の例が最も役立ちますが、ほとんどの言語を簡単に理解できます。

4

1 に答える 1

0

再帰関数を使用して自己参照カテゴリ テーブルをトラバースすることを気にしない場合は、そのルートに進むようにデータベースを再設計してください。SQL の再帰関数はパフォーマンスの自殺だと考える人もいるかもしれませんが、適切なインデックスを設定すると、非常に高速に完了することができます。

使用しているデータ セットについては、サンプル Web サイトから、現在のカテゴリを URL クエリに保存していることがわかります。

事務用品 > 封筒、封筒、配送用品 > 封筒
?N=4294858589&...

事務用品 > 封筒、郵送物、配送用品 > 封筒 > 小冊子とカタログの封筒
?N=4294858588&...

ここで、N は現在のカテゴリです。彼らのデータベースには、レベル N が何に属しているかを確認するためのルックアップ テーブルがあると思います。または、次のような大きな WHERE/ORDER BY 句を実行することもできます。

WHERE (ECDB2_LVL_1_ID == @N) OR (ECDB2_LVL_2_ID == @N) OR (ECDB2_LVL_3_ID == @N) ...
ORDER BY ECDB2_LVL_1_ID, ECDB2_LVL_2_ID, ECDB2_LVL_3_ID...

N が第 2 レベルのカテゴリの場合、並べ替え時に null が一番上に来るため、第 3 レベルのカテゴリを持たない製品が最初に表示されます。

余談ですが、セッションで製品にたどり着くためにどのカテゴリをたどったかを追跡します。URL が ?R=12345 のようなものになるまで、製品までカテゴリをたどります。ブレッドクラムには、その製品を見つけるために使用されたカテゴリが表示されます。Cookie をクリアしてページを更新すると、パンくずリストが Biggest Book > Product Detail に変わります。これは、検索エンジンからこのページにアクセスした人にとってはあまり役に立ちません。なぜなら、カテゴリを簡単に選択して、類似の製品が入手可能かどうかを確認できないからです。

于 2009-01-15T15:45:48.460 に答える