2010-09-13 3 views
0

En supposant un système similaire à Netflix où les membres créent une liste de films et, en fonction de leur type de plan, un, deux ou plusieurs de ces films dans leur tour de liste en ordres, lequel des schémas suivants a plus de sens?Quel schéma MySQL est optimal pour ce type de système?

  1. Un contrôle table stockant les colonnes suivantes:

    contrôle (MemberID, currentMoviesAtHome, moviesAtHomeLimit, currentMonthlyMovies, monthlyMoviesLimit)

L'utilisateur ne décide pas réellement quand l'ordre est créé Cela dépend de leurs contrôles de compte. Une fonction quotidienne passera par les clients et leurs contrôles et choisir ceux où currentMoviesAtHome < moviesAtHomeLimit AND currentMonthlyMovies < monthlyMoviesLimit ...

  1. Une table accounts distincte liée à un plans plans tableau:

    comptes (memberid, PlanID, currentMoviesAtHome, currentMonthlyMovies)

    plans (PlanID, moviesAtHomeLimit, monthlyMoviesLimit)

+1

N'avez-vous pas un autre tableau répertoriant les films dont dispose un utilisateur, y compris ceux qui ont été renvoyés au cours du mois dernier? Ne préféreriez-vous pas 'SELECT COUNT (*) WHERE ...' sur cette table pour déterminer 'currentMoviesAtHome' et' currentMonthlyMovies' plutôt que de stocker des valeurs séparées qui peuvent être désynchronisées? –

Répondre

2

La deuxième option, ayant les tables ACCOUNTS et PLANS, est normalisée donc ce serait ma recommandation.

De plus, ces tables:

  • MOVIES
  • WISHLIST
    • movie_id (clé primaire, clé étrangère à MOVIES.movie_id)
    • account_id (clé primaire, clé étrangère à ACCOUNTS.account_id)
    • is_onsite

is_onsite est un booléen permettant de déterminer si le film a été envoyé au client. Si c'est le cas, la valeur doit être définie sur 1. Utilisez cette somme pour savoir si le compte est à ou sous la limite de leur plan. Lorsque des vidéos sont renvoyés, ne supprimez les lignes qui ont is_onsite mis à 1.

0

Une fonction quotidienne passera par clients leurs commandes et choisir

Cela ne répond pas à votre question, mais je pensais que je mentionnerais que votre conception est sous-optimale. Plutôt que de voter, comme vous le décrivez ci-dessus, il vaut mieux décider quoi faire à la demande; c'est-à-dire qu'il y aura évidemment un moment dans l'utilisation de votre application où les valeurs limites seront mises à jour. Ce que vous devriez faire est de déclencher une sorte d'événement à ce moment-là et consommer l'événement qui décidera d'envoyer ou non un autre film.

L'interrogation quotidienne ne sera pas mise à l'échelle.

Le déclenchement et la gestion d'un événement seront non seulement plus rapides, mais aussi plus faciles à maintenir à long terme. Bonne chance.

+0

L'alternative consiste à exécuter la logique lorsqu'un film/élément est renvoyé. L'interrogation ne sonne pas si mal quand cela peut être fait une fois par jour pour cette situation, car il est peu probable qu'un article soit retourné et envoyé au client suivant en un jour. C'est plausible, mais en tant que fournisseur de services, vous voulez une petite marge de manœuvre. –

+0

@ Ribald, en utilisant cette approche signifie que je dois vérifier chaque fois qu'un utilisateur change sa liste de souhaits/ajoute supprime un élément ... ne gaspille pas de ressources si l'utilisateur a déjà ses commandes maximum? À quoi sert-il de vérifier si nous devons créer une commande lorsque la personne a atteint sa limite maximale ou a déjà deux commandes ouvertes? – Mohamad

+1

Vous n'avez pas besoin de re-vérifier quand un utilisateur ajoute ou supprime un élément à sa liste de souhaits, puisque la modification de cette information ne change pas la valeur du nombre de films qu'ils ont extraits. OMG Ponies a raison, il suffit de vérifier quand vous allez modifier les valeurs en question; c'est-à-dire, lorsqu'un film est renvoyé. – RibaldEddie

Questions connexes