myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Filtern von Daten bei dem ein Ergebnis nicht noch einmal beim Filtern angezeigt werden darf
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Filtern von Daten bei dem ein Ergebnis nicht noch einmal beim Filtern angezeigt werden darf

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Olii
myCSharp.de-Mitglied

Dabei seit: 20.09.2017
Beiträge: 68


Olii ist offline

Filtern von Daten bei dem ein Ergebnis nicht noch einmal beim Filtern angezeigt werden darf

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo liebe User,

ich wollte mal ein Thema ansprechen worüber ich mir schon lange den Kopf zerbreche. Es geht um das Filter von Daten, aber nicht einfach nur ein Filtern wie select * from User where User = "Mark".

Ich versuche es mal an einem Beispiel zu verdeutlichen was genau ich meine:

Nehmen wir an es gibt einen Webshop. Dieser Webshop ist aber etwas anders aufgebaut als ein normaler Webshop.
Ein User kann einen ODER mehrere Filter wählen um sich seine Wunschprodukte anzeigen zu lassen.
ABER sobald er ein Produkt angeklickt bzw. sich ein Produkt angesehen hat, soll dieses Produkt diesem User nie wieder angezeigt werden, auch nicht, wenn er die selben Filter Kriterien einstellt wie zuvor.

(In einem echten Shop würde das natürlich keinen Sinn machen aber ich glaube das Beispiel zeigt ganz gut was gemeint ist)

Ich dachte zuerst ich könnte einfach die Produkte in einer Tabelle speichern die der User bereits gesehen hat und dann quasi mit einem umgekehrten INNER JOIN zwischen der "User" und der "UserHatDiesesProduktGesehen" Tabelle einfach immer die Produkte nehmen die nicht in der Tabelle "UserHatDiesesProduktGesehen" stehen.

Aber nehmen wir an es sind über 10.000 User registriert und jeder dieser User schaut sich täglich 30 Produkte an. Die Tabelle "UserHatDiesesProduktGesehen" würde sich ungemein schnell vergrößern und irgendwann nach kurzer Zeit würde das Auflisten der Produkte so lange dauern da, jedes mal diese Query ausgeführt werden muss.

Kennt jemand Herangehensweisen oder etwas der gleichen wie man so etwas umsetzen kann?
Neuer Beitrag 05.01.2019 12:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.350
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hast du den schon einen passenden Index gesetzt, der auch beim Join verwendet wird?
Falls nicht, muss ggf. die gesamte Tabelle gelesen werden, was den Join dann unheimlich langsam macht!

Ebenfalls bieten Datenbanken durch Partitionierung dann auch zusätzlich die Möglichkeit die Daten so aufzuteilen, dass diese gezielt für solche Vorhaben gespeichert werden können.
Somit kannst du z.B. eine Partition pro User ID festlegen.
Dies hat dann den Vorteil, dass eben alle gesehenen Produkte für diesen Benutzer auf Datenbankebene auch in dieser Partition vorliegen.
Dies spart der Datenbank viele Suche und Tabellen zugriffe, da eben nur die jeweilige Partition in einem Rutsch gelesen werden muss.

Nachtrag:
Was die Datenmenge noch angeht.
Jede gängige SQL Datenbank ist im Stande Joins über Tabelle zu machen, die teils über mehrere Mio. Datensätze beinhalten.
Dein Fall mit 10.000 Usern und 30 Produkten würde pro Monat "nur" 9.000.000 Einträge in deiner Tabelle erzeugen.
Diese müsstest du auch zukünftig um Einträge bereinigen, wenn z.B. Produkte gelöscht werden.
Sonst hast du nach Jahren unnötig viele Daten in der Tabelle stehen.

Deine Tabelle dürfte im einfachsten Fall auch nur eine Tabelle mit zwei Spalten sein.
Der UserId und der ProduktId.
Diese würden dann auch den PK bilden, was je anch Datentypen auch eine recht kleine Tabelle erzeugen dürfte.
Für die DB also eine ganz simple Relationstabelle die ohne große Probleme gelesen werden kann, da der PK selbst ein Index ist.

T-Virus

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am 05.01.2019 12:56.

Neuer Beitrag 05.01.2019 12:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.166
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

99% der Shops verwenden für Produkte keine SQL sondern NoSQL Datenbanken.
Mit diesen lassen sich solche Szenarien viel performanter umsetzen.
Neuer Beitrag 05.01.2019 18:42 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Monate.
Der letzte Beitrag ist älter als 10 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 13.11.2019 02:33