2017-04-21 3 views
0

Ich habe eine Tabelle Produkte wie folgt:Speichern Filterkriterien auf einer SQL-Datenbank

create table dbo.Product ( 
    Id int not null 
    Name nvarchar (80) not null, 
    Price decimal not null 
) 

I Baskets (Listen von Produkten) erschaffe wie folgt:

create table dbo.Baskets ( 
    Id int not null 
    Name nvarchar (80) not null 
) 

create table dbo.BasketProducts ( 
    BasketId int not null, 
    ProductId int not null, 
) 

Ein Korb erstellt basiert auf a Suchkriterien unter Verwendung von Parametern:

  1. MinimumPrice;
  2. MaximumPreis;
  3. Kategorien (können null bis viele sein);
  4. MinimumWarrantyPeriod

Ich brauche so um diese Parameter zu speichern und später weiß ich, wie der Korb erstellt wurde.

In Zukunft werde ich mehr Parameter hat, damit ich 2 Optionen:

  1. hinzufügen Minimum, MaximumPrice und MinimumWarrantyPeriod als Spalt zum Warenkorb Tisch und eine BasketCategories und Kategorien Tabellen in dem Korb zu Kategorien beziehen.

  2. erstellen flexibler Entwurf, der einen Parameter Tabelle:

    Tabelle dbo.BasketParameters erstellen ( BasketId int not null, ParameterTypeId int not null, Wert nvarchar (400) nicht null )

    Tabelle dbo.ParameterType ( Id int not null Namen nvarchar (80) nicht null )

erstellen

Parametertypen sind Minimum, MaximumPrice, Kategorien, MinimumWarrantyPeriod usw.

Also für jeden Korb Ich habe eine Liste von BasketParameters, die alle verschieden sind, jeweils auf Wert. Später, wenn ich für Parametertypen brauche, füge ich sie der ParameterType-Tabelle hinzu ...

Die Anwendung wird verantwortlich sein für die Verwendung jedes Basket-Parameters, um den Warenkorb zu erstellen ... Ich werde zum Beispiel eine Tabelle Kategorien haben, aber von den BasketParametern entkoppelt sein.

Macht das Sinn? Welchen Ansatz würden Sie verwenden?

Antwort

0

Ihre erste Option ist besser (besonders, da Sie einen relationalen Datenspeicher verwenden, z. B. SQL Server), da sie ordnungsgemäß referenziell ist. Dies wird viel einfacher zu pflegen und abzufragen als auch viel leistungsfähiger.

Ihre zweite Lösung ist äquivalent zu einer EVA-Tabelle: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

der in der Regel eine schreckliche Idee ist (und wenn Sie diese Art von Flexibilität benötigen, sollten Sie wahrscheinlich eine Dokumentendatenbank oder andere NoSQL-Lösung verwenden Sie stattdessen). Der einzige Vorteil besteht darin, dass Sie Attribute regelmäßig oder nach anderen Kriterien hinzufügen/entfernen müssen.

+0

Eigentlich ist EAV eine unglaublich leistungsstarke Lösung, wenn es richtig gemacht wird. Ich habe es oft als Erweiterung zu mehr standardmäßigen relationalen Daten mit großem Erfolg verwendet. Das heißt, EAV kann falsch verwendet werden und es ist wirklich schrecklich. –

+0

@SeanLange In der Tat kann es in bestimmten Szenarien sehr nützlich sein, aber es klingt wie OPs Daten sind ziemlich gut strukturiert, statische und nicht zu ändern 'zu viel', daher würde ich sehr bevorzugen, erste Lösung – Milney

+0

Ich mag wirklich nicht die erste Lösung von Hinzufügen neuer Spalten für jeden Filtertyp. Vor allem angesichts der Tatsache, dass das OP angibt, dass sich die Filter ändern werden. Das würde das Hinzufügen/Entfernen von Spalten aus der Tabelle und alle Abfragen erfordern, die es jedes Mal berühren, wenn sich die Filteroptionen ändern. Irgendwie besiegt der Punkt der relationalen Daten. –

Verwandte Themen