Comment identifier les doublons recueillies à partir de plusieurs flux et un lien vers eux dans une base de données

StackOverflow https://stackoverflow.com/questions/4275954

Question

J'ai une base de données stockant les détails des produits qui sont pris de nombreux sites et ramassant à travers les différents sites de l'API. Quand j'appelle l'alimentation, les détails sont stockés dans une table de base de données.

Le problème que je vais avoir est que, parce que le même produit exact est coté sur de nombreux sites par le vendeur, je finis par avoir des doublons dans ma base de données, puis quand je les afficher sur une page Web il y a beaucoup de doublons.

Le problème est que l'élément n'a pas identifiant unique évident, il a des détails spécifiques de l'élément (dont il pourrait y avoir beaucoup), puis une description de l'élément du vendeur.

Ce que je voudrais est pour l'élément pour afficher une fois, puis donner les détails de l'utilisateur de l'endroit où l'autre élément est affiché.

Comment puis-je identifier les doublons qui ont entrer, sans ralentir la base de données entière? Comment puis-je aussi puis choisissez une annonce de tous les doublons, puis stocker ce que d'autres sites, l'annonce est affichée sur.

Merci pour toute aide.

Était-ce utile?

La solution

Le problème est double, et les deux sont de votre côté. Lorsque vous savoir comment faire face à cela, écrire le code dans un programme (Java ou SQL sera facile). Je vais les nommer d'abord, puis identifier les solutions.

  1. Pour une raison inconnue, vous avez supposé que la collecte des descriptions de produits de mulitple ne recueillerons pas le même produit.

  2. Vous êtes habitué à la commune et de la colonne de Id aucun sens, ce qui est bien quand vous travaillez avec des feuilles de calcul des fonctionnalités de prototypage; mais il est loin d'être ce qui est nécessaire pour une base de données ou des fonctionnalités de niveau de développement. Vos utilisateurs (ou patron) ont une capacité naturelle de base de données attendue à partir de la base de données, et vous ne fournir aucune. (Et non, il n'a pas besoin d'une logique de chaîne floue ou la magie de toute sorte.)

Solution

Ceci est une version condensée du IDEF1X standard pour la modélisation bases de données relationnelles; la partie re Identifiers.

  1. Vous devez penser en termes de base de données, et réfléchir sur les tables de base de données dont vous avez besoin pour effectuer votre fonction, ce qui signifie que vous n'êtes pas autorisé à utiliser une colonne Id auto-incrément. Cette colonne donne une feuille de calcul d'un RowId, mais cela ne signifie rien sur le contenu de la table, ou les colonnes qui identifient un produit.

  2. Et vous ne pouvez pas simplement les données arnaque un autre site, vous devez penser à ce que votre site a besoin pour les produits. Qu'est-ce que votre entreprise comprend un produit à être, et comment il identifie un produit?

  3. Identifier toutes les colonnes et les types de données pour les colonnes.

  4. Identifier les colonnes sont obligatoires et optionnels.

  5. Identifier qui sont forts Identifiants . Par exemple. Manufacturer et Model; court Product Name, pas long Description (ou peut-être pour votre entreprise, la description longue est un identificateur). Travaillez avec vos utilisateurs et travail sur.

  6. Vous trouverez vous avez fait un petit groupe de tables autour Product, comme Manufacturer, ProductType, peut-être Vendor, etc.

  7. Organiser les tables et les Normaliser, de sorte que vous ne dupliquez pas les données.

  8. Assurez-vous que vous traitez ces Identifiants avec un peu de respect. Choisissez qui sera unique. Ce sont candidats clés . Vous avez besoin d'au moins un par table, et il y aura plus d'un Product. Tous les Identifiants qui seront à la recherche sur devront être indexés (unique ou non). Notez que les indices unique ne peut pas être Nullable, de sorte que vous ne pouvez pas choisir une colonne en option.

  9. Ce qui fait un identificateur unique pour Product ne peut pas être une seule colonne. C'est ok, nous pouvons évaluer plusieurs colonnes pour les clés dans les bases de données; ils sont appelés Touches composées .

  10. Prenez le meilleur, le plus stable (celui qui ne changera pas) Identifiant unique, l'une des clés candidates, et faire que le Clé primaire .

  11. Si, et seulement si, l'identificateur unique, la clé primaire, qui peut être un composé clé, est très longue, et ne conviennent donc pas pour une clé primaire, qui est migré vers les tables de l'enfant, puis add Surrogate Key . Ce sera la colonne Id. Notez que c'est une colonne supplémentaire et l'indice supplémentaire. Il ne remplace pas les Identifiants de Product, les candidats clés; ils ne peuvent pas être supprimés.

Jusqu'à présent, nous avons une base de données de produit sur votre côté de sociétés sur le web, qui est significatif pour elle. Maintenant, nous sommes en mesure d'évaluer les produits de l'autre côté de la toile; et quand nous le faisons, nous avons un cadre de notre côté that est forte, contre laquelle nous pouvons mesurer les déchets que nous recevons de l'autre côté de la bande.

Flux

  1. Vous avez besoin d'une table de WebSite pour gérer les flux.

  2. Il y aura une table Associatif (many-to-many) entre Product et WebSite. Appelons-le ProductSite. Il contiendra seulement notre ProductId et le WebSiteCode. It may containPrice`. Le contenu sont valables pour un seul cycle d'alimentation.

  3. Charger chaque alimentation dans une base de données de mise en scène ou d'un schéma, une table ProductIn entrant, peut-être un par site source. Ceci est juste le fichier plat de la source externe. Ajouter un IsValid colonne et définir la valeur par défaut à true.

  4. Ensuite, écrire quelques SQL qui compare cette table de ProductIn, avec son contenu en vrac et de disquettes, avec notre table Product avec ses fortes Identifiers.

    • La façon dont je le ferais est, plusieurs vagues de contrôles séparés, chaque marque les lignes qui échouent, avec IsValid false. A la fin Insérez les lignes de IsValid dans notre ProductSite.

    • Vous pourriez avoir de la chance, et sortir avec une approche optimiste. C'est, aussi longtemps que vous trouverez un match sur quelques colonnes importantes, le match est valide. (Inverser le défaut et la mise à jour de la valeur booléenne de IsValid).

    • Ceci est le proc qui nécessitera un travail de back-et-vient, jusqu'à ce qu'il installe. Voilà pourquoi vous devez travailler avec vos utilisateurs re les indentifiers. Le but est d'exclure aucun produit externes, mais votre point de départ exclura beaucoup. Cela comprendra revenir à notre table Product et d'améliorer le contenu (valeurs dans les lignes) des Identifiants et autres colonnes pertinentes que vous utilisez pour identifier les lignes correspondantes.

  5. Répéter pour chaque WebSite.

  6. Maintenant remplir notre site Web de notre table Product, en utilisant les informations que nous sommes sur le point confiance, et de montrer quels sites ont le produit en vente à partir ProductSite.

Autres conseils

Je ne pense pas que ce soit un problème de code ou base de données (encore). Vous dites:

  

Le problème est que l'élément n'a pas identifiant unique évident

Vous devez travailler ce qui est uniqeness avant de pouvoir demander à un ordinateur pour le faire pour vous. On dirait que vous avez besoin d'une sorte d'algorithme flou, la similarité des chaînes.

Voici quelques exemples de données que vous considérez comme des doublons pourrait aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top