2010-06-02 5 views
3

J'ai peu de questions pour les gourous SQL ici ... En résumé, c'est le système de gestion des annonces où l'utilisateur peut définir des campagnes pour différents pays, catégories, langues. J'ai quelques questions à l'esprit alors aidez-moi avec ce que vous pouvez.Conception SQL complexe, aide/conseil nécessaire

Généralement j'utilise ASP.NET et je veux mettre en cache tous les résultats de certains utilisateurs une fois qu'il demande des statistiques pour la première fois, de cette façon j'éviterai de gros allers-retours au serveur.

toute aide est la bienvenue

Click here for diagram avec tous les détails dont vous avez besoin pour mes questions

question 1.Main de cette application est de montrer à l'utilisateur le nombre de clics/impressions étaient et combien d'argent il a passé en campagne. Quel est le moyen le plus simple d'obtenir cette information pour lui? Je vais également inclure le filtrage par date, plages de dates et quelques autres paramètres dans ce tableau de statistiques.

2. L'autre problème est ce qui se passe lorsque l'utilisateur essaie de modifier la campagne. L'ancienne campagne va mourir, cela signifie que si l'utilisateur définit 0.01 $ comme campaignPPU (pay-per-unit) et le jour suivant le met à 0.05 $, tout sera réinitialisé à 0.05 $.

3.Si vous pouviez re-concevoir certaines parties de la conception de la table afin qu'elle soit plus flexible et plus facile à modifier, comment le feriez-vous?

Merci ... désolé pour si grand travail, mais il peut intéresser certains types SQL ici

+2

Base de données assez bien normalisée ... :-) – Lucero

+0

C'est un très joliment mis en place db. Mais je dois demander est l'histoire de la rémunération par unité importante. Dois-tu être capable de suivre le paiement par unité sur les campagnes précédentes ou anciennes? –

+0

@John Hartsock, PPU est important parce que je vais l'utiliser pour calculer combien d'argent dépensé par l'utilisateur, donc si la campagne de modification de l'utilisateur et set ppu inférieur ou supérieur, je ne serais pas en mesure de lui donner des estimations correctes – eugeneK

Répondre

2

Pour # 1, vous pouvez utiliser une série de vues pour montrer des statistiques intéressantes. Si vous souhaitez mettre en cache les résultats, vous pouvez stocker les résultats dans une table de reporting qui ne sera actualisée que tous les n heures (peut-être jusqu'à 3 ou 4 fois par jour? Je ne sais pas ce qui serait approprié pour ce scénario).

Une fois que toutes les données sont dans une table de rapport, vous pouvez mieux l'indexer pour le filtrage, et comme elle sera purgée et ranimée selon un planning, elle devrait être plus rapide d'accès.

Notez que cela ne fonctionnera que si le remplissage de la table de statistiques ne prend pas trop de temps (vous devrez être le juge de combien de temps est "trop ​​long").

Pour le n ° 2, cela ressemble à un problème de conception sous-jacent. Que voulez-vous dire par "modifier"? Est-ce que cette opération d'édition détruit l'ancienne campagne et crée une nouvelle campagne "clone" (qui n'est évidemment pas un clone parfait ou il n'y aurait pas de problème)? Y a-t-il des données historiques qui sont importantes, mais qui deviennent orphelines ou supprimées par la modification? Vous pouvez analyser ce processus de "modification" et voir si vous devez ajouter le suivi de l'historique à certaines de ces tables. Peut-être un simple datetime pour les anciens enregistrements, ou une ou plusieurs tables "history" séparées qui reflètent la structure des tables en cours de modification par l'opération "edit". Pour le n ° 3, ça semble bien, mais je ne vois qu'une petite partie du système. Je ne sais pas comment le reste de l'application est conçue ...

+0

@FrustratedWithFormsDes, 1. Les vues sont correctes mais chaque jointure contiendra environ 5-8 jointures avec ce niveau de normalisation. Peut-être que vous voyez un moyen de dé-normaliser les tables pour éviter les jointures 5-8 2. Que dois-je faire en cas de campagne de modifications de l'utilisateur. Je ne serais pas capable de montrer des statistiques correctes parce que PPU sera différent. Si je crée une autre table, ie. HistoryOfCampaigns je serai nécessaire pour boucler des versions pensées pour obtenir des statistiques correctes pour la campagne en cours. – eugeneK

+0

@FrustratedWithFormsDes, pouvez-vous me donner un conseil sur la façon de concevoir la table des rapports? Je n'ai aucune idée pour le moment. Il doit contenir la date et l'heure, l'état de la campagne, les clics, les options de filtrage des impressions. – eugeneK

+1

@eugeneK: La table de rapport doit contenir les colonnes qui seront nécessaires pour les rapports de statistiques pour vos utilisateurs. Donc, peut-être UserID, CampaignID, CampaignName, CampaignDate, AmountSpentToDate (il peut s'agir d'une colonne calculée, au moment où les données sont générées), ... Ensuite, vous devrez remplir la table de rapport avec les données que vous voulez. * Beaucoup * façons de le faire. Peut être programmé toutes les heures, ou seulement sur demande par utilisateur ... La manière la plus simple pourrait être de le faire une fois par jour, à minuit (si cela prend beaucoup de temps). Et oui, les données dans la table de rapport pourraient être un peu dénormalisées, mais c'est OK. – FrustratedWithFormsDesigner

1

Eugene,

Si vous envisagez de garder les campagnes autour de ne pas édités envisager de les supprimer. Au lieu de rendre les campagnes sensibles à la date. Par exemple, UserA a lancé la campagne 1 le 1/1/2010 et l'a terminée le 2/1/2010, puis a lancé campaign2 le 2/2/2010.

Ou si vous n'aimez pas la notion de fin de vos campagnes. Vous pouvez envisager une table d'historique pour vos campagnes.Fondamentalement, la même structure de table mais un UniqueIdentifier ajouté pour rendre les lignes uniques.

Je devrais également noter que la taille estimée de cette table de campagne et de ses tables liées sont importantes sur votre conception. Si vous prévoyez d'avoir seulement 1000s de lignes en conservant les enregistrements anciens et actuels dans une table n'est pas un problème. Toutefois, si vous envisagez d'avoir 1000000 ou plus, vous pouvez séparer l'ancien du nouveau pour des requêtes plus rapides, ou planifier correctement les statistiques et les indices sur les champs que vous devez filtrer. Rappelez-vous aussi que les indices sont utiles pour les lectures, mais ils ralentissent les écritures.

+0

J'ai pensé à la table d'histoire. Chose est que cela n'a pas de sens quand je le conçois. Supposons que chaque modification de ppu ou dailyBudget soit enregistrée dans la table CampaignsHistory, des éléments tels que campaignName ne valent pas l'enregistrement dans HistoryTable. Maintenant, je veux savoir combien d'utilisateurs ont passé dans un certain laps de temps. Je serai nécessaire pour faire une boucle sur toutes les lignes dans HistoryTable qui correspondent à la campagne en cours et générer ce rapport pour l'utilisateur. TBH ce sera la surcharge du CPU. Une autre façon de résoudre le problème est de définir parentCampaignID pour toute modification qui sera plus ou moins identique à celle de HistoryTable – eugeneK

+0

Si vous allez gérer les choses de cette manière, utilisez un GUID/UniqueIdentifier pour la clé primaire. De cette façon, l'ID de l'enregistrement dans la table d'historique aura toujours référence à vos tables de détail. Remarque n'utilisez pas une clé primaire en cluster sur un PK GUID. Ce n'est pas efficace car les guids ne sont pas séquentiels –

+0

comment je devrais obtenir des informations de la table Historique et de la table actuelle pour que je puisse créer un rapport si le GUID se connecte à la fois? – eugeneK