0

Je travaille actuellement sur un projet ASP.Net MVC pour une classe de génie logiciel. Mon but est de créer un petit système de location de jeux en ligne. J'ai actuellement 3 tables, films, jeux et registrants; et j'utilise LINQ-to-SQL pour définir chacune de ces tables comme des classes pour mon modèle. Jusqu'à présent, j'ai créé des modèles pour les films et les jeux, ce que je voudrais faire lors de la création du modèle de titulaire est de créer une relation entre les titulaires et les films et les jeux. Ce que j'ai essayé jusqu'ici est de définir une clé étrangère entre l'identifiant (la clé primaire dans la table Registrant) et un champ registrantID dans les films et les jeux. Ce que j'ai réalisé, c'est que si je devais supprimer une instance d'un registrant, il supprimerait le film et/ou le jeu associé des autres tables. Ce que je pense à faire est de créer deux modèles distincts définissant rentedGames et rentedMovies et de créer une relation entre ceux-ci et la table Games and Movies afin d'essayer de modéliser un registrant location/retour/achat de films ou de jeux du magasin.Tables de base de données relationnelles

En résumé:

Ce que j'ai jusqu'à présent:

  • 3 tables: Registrants, Films et Jeux.
  • Modèles LINQ-to-SQL pour mon inventaire de films et de jeux .

Ce que je suis en train d'installer:

  • Un modèle pour une location inscrit/retour d'un film et/ou jeu, quand un jeu est loué/retourné, est placé un drapeau à côté de la article dans l'inventaire pour indiquer son statut.

Question:

  • Est-ce que l'ajout de tables séparées pour modéliser un film/jeu loué éviter que des éléments définis dans mes modèles d'inventaire de être supprimé ?? c'est-à-dire lorsqu'un client retourne un film loué, l'instance de rentedMovie est supprimée, mais le film n'est pas référencé dans l'inventaire de film.

  • Y at-il une telle chose comme une table connexe ayant un indicateur d'état situé sur l'entrée correspondante , par opposition à l'entrée suppression, chaque fois que l' entrée associée dans l'autre table est modifiée ?? c'est-à-dire lorsqu'un client renvoie un film loué, l'instance de rentedMovie définit un indicateur dans le film auquel il fait référence qu'il est disponible à la location, l'instance de rentedMovie est alors supprimée.

Répondre

0

Vous avez raison de créer des tables séparées pour rentedGames et rentedMovies, puisque ce modèle permet maintenant plus d'un film ou un jeu du même type étant loués en même temps, ce qui est certainement plus réaliste que d'avoir une seule instance d'un film ou d'un jeu en particulier.

Cela empêchera la suppression de l'enregistrement parent, lorsque l'enregistrement de lien (locationMovie, par exemple) est supprimé. Mais cette suppression du film parent ne devrait pas se produire de toute façon si vous avez configuré votre relation pour ne pas supprimer en cascade, et vous avez autorisé le champ registrantID dans les tables originales de films ou de jeux à être nul.

Pour répondre à votre deuxième question (que je réalise suppose un seul film/jeu pour un titre particulier): la façon dont cela est normalement fait, si vous utilisez des tables de liens, ce que vous voulez faire, est simplement pour supprimer l'enregistrement rentedMovie/Game. L'absence d'un enregistrement de lien pour un film ou un jeu est tout ce que votre code doit déterminer afin de savoir que ce film ou jeu est maintenant louable (encore).

0

Je sais que vous faites ceci pour un cours/une pratique, donc ceci peut ne pas être pertinent, mais considérez qu'avoir l'historique de location pour les choses est souvent très utile. Pour cette raison, vous pouvez ne pas vouloir supprimer les enregistrements loués, mais simplement marquer l'article comme étant renvoyé.

Tenir compte:

TABLE RentalTransaction: 
RentalTransactionID integer PK NOT NULL 
CustomerID integer FK NOT NULL 
RentedOn datetime NOT NULL 
DueDate datetime NOT NULL 
<..any other fields you may need..> 

TABLE RentalItems: 
RentedID integer PK NOT NULL 
RentalTransactionID integer FK NOT NULL 
RentedItemID integer FK NOT NULL 
RentedQty integer NOT NULL 
RentalRetuned datetime NULL 

Vous pouvez voir si un élément individuel est hors ou non par si son domaine est RentalReturnednull ou non. Si elle est non nulle, alors vous savez que l'article est de retour, et maintenant vous pouvez agréger les données de location pour voir combien de fois il sort, quelle est la durée moyenne de la location, etc., etc. Vous devrez intégrer quelques vérifications pour faire Bien sûr, vous n'avez pas loué plus de copies d'un article que vous n'en avez réellement et d'autres choses de ce genre, mais je pense que c'est globalement un début de schéma plus flexible. Cela peut aussi être trop compliqué pour ce que vous faites, mais je voulais au moins faire ressortir l'idée.

0

Voulez-vous vraiment supprimer l'instance de rentedMovie? Comment allez-vous indiquer combien de films une personne a loué, etc.?

Je suggérerais de repenser légèrement votre modèle. Vous avez besoin d'un emplacement pour stocker des données sur les personnes, un emplacement pour stocker des données sur les articles et un emplacement pour stocker les données sur les personnes/articles dans un premier temps. Ignorez la différence entre les films et les jeux pour l'instant - cela devient un processus de normalisation une fois que vous avez défini votre structure sous-jacente.

comme un simple point de départ, vous devriez avoir:

Personnes 1..1 ---- 1 .. * 0 .. * HiRes ---- 1..1 Articles

où le Hires table est une table de liaison entre les deux autres avec une clé combinée composée de personID, ItemID et un horodatage de quelque description (pour permettre la relocation du même film).

Vous pouvez alors regarder une table distincte pour les types d'objets, etc.

1

Je vais à ce sujet un peu différemment. Premièrement, y a-t-il une véritable raison de traiter un Movie et un Game comme des entités distinctes? Pourquoi ne pas avoir un RentableItem qui peut être soit un film, un jeu, une machine de jeu, un lecteur Blue-Ray ou quoi que ce soit? Vous souhaitez saisir par un champ item_id, et il aurait prévu les métadonnées (title, type, genre, rental_class, and so on). Ensuite, vous devez modéliser le fait qu'un Registrant loue une ou plusieurs RentableItems. Cela peut être fait avec une table Rental , dont les lignes de chaque connecter un loués RentableItem avec un particulier Registrant (qui est, le Rental est calée par un rental_id et il a une clé étrangère à RentableItem.item_id et une clé étrangère Registrant.registrant_id. le Rental aurait également la date d'échéance, un « retourné "drapeau, le prix de la location, etc.

alors vous savez un RentableItem est pas dans le magasin, s'il y a un enregistrement dont la location item_id est le même que les RentableItem « s et dont le « retour » drapeau est faux. Vous n'avez jamais à modifier la table RentableItem elle-même, juste la table Rental.

0

La première chose à considérer est qu'un film est en fait deux entités, un titre et un média. Le titre est "Seigneur des Anneaux", tandis que les médias sont un DVD que vous rapportez à la maison. Un titre peut avoir plusieurs médias (copies), tandis qu'un média a un titre. Rental table a une ligne pour chaque location de médias, cette table obtient une nouvelle rangée chaque fois qu'un code à barres est scanné sur la location, tandis que DateReturned est rempli au retour. Le champ Status du tableau Media permet de suivre l'état d'entrée/sortie de chaque disque/jeu. Si vous estimez que vous devez suivre les films loués ensemble à un client, vous pouvez le trouver par DateRented (date/heure) ou ajouter un ReceiptNumber ou ShoppingBasketID au tableau Rental.

gamerental_model_01

Questions connexes