0

我目前正在为软件工程课程开发一个 ASP.Net MVC 项目。我的目标是创建一个小型网络游戏租赁系统。我目前有 3 张桌子,电影、游戏和注册人;我正在使用 LINQ-to-SQL 将这些表中的每一个定义为我的模型的类。到目前为止,我已经为 Movies and Games 创建了模型,在创建 Registrant 模型时我想做的是创建 Registrants 与 Movies and Games 之间的关系。到目前为止,我尝试的是在电影和游戏中的 ID(Registrant 表中的主键)和 registrantID 字段之间定义一个外键。我意识到,如果我要删除注册者的实例,它将从其他表中删除相关的电影和/或游戏。我什么

总之:

到目前为止我所拥有的:

  • 3 个表:注册人、电影和游戏。
  • 我的电影和游戏清单的 LINQ-to-SQL 模型。

我要设置的内容:

  • 注册者租借/归还电影和/或游戏的模型,当租借/归还游戏时,会在库存中的项目旁边放置一个标志以指示其状态。

问题:

  • 添加单独的表格来为租借的电影/游戏建模会阻止我的库存模型中定义的项目被删除吗?即当客户返回租借的电影时,rentedMovie 实例被删除,但电影库存中没有引用该电影。

  • 每当修改另一个表中的关联条目时,是否存在在相关条目上设置状态标志的相关表,而不是被删除的条目?即,当客户返回租借的电影时,rentedMovie 实例在它所指的电影中设置一个标志,表明它可以出租,然后删除rentedMovie 实例。

4

5 回答 5

1

我会有所不同。首先,是否有真正的理由将 aMovie和 aGame视为单独的实体?为什么不拥有一个RentableItem可以是电影、游戏、游戏机、蓝光播放器或其他任何东西的设备?您将通过一个item_id字段对其进行键控,并且它将具有预期的元数据 ( title, type, genre,然后您需要对 a租用一个或多个rental_class, and so on). 的事实进行建模。这可以通过一个表来完成,该表的每行都将租用的一个与一个特别(也就是说,a 是键控,它有一个外键 to和一个外键 to 。 the也会有到期日、“归还”标志、租金价格等。 RegistrantRentableItemsRentalRentableItemRegistrantRentalrental_idRentableItem.item_idRegistrant.registrant_idRental

如果有一个出租记录,其 item_id 与's 相同,并且其“已返回”标志为 false,那么您就知道 aRentableItem不在商店中。RentableItem您永远不必修改RentableItem表本身,只需修改Rental表即可。

于 2009-11-26T04:23:57.093 回答
0

You're right to create separate tables for rentedGames and rentedMovies, since this model now allows for more than one movie or game of the same type being rented at the same time, which is surely more realistic than having only one instance of a particular movie or game.

This will prevent the deletion of the parent record, when the link record (rentedMovie, say) is deleted. But this deletion of the parent movie should not be happening anyway if you've set up your relationship to not 'cascade delete', and you allowed the registrantID field in the original Movies or Games tables to be nullable.

To answer your second question (which I realise assumes only one movie/game for any particlar title): the way this is normally done, if you're using link tables, which is what you want to do, is simply to delete the rentedMovie/Game record. The absence of a link record for any Movie or Game is all your code needs to determine in order to know that that movie or game is now rentable (again).

于 2009-11-26T04:09:17.247 回答
0

我知道您这样做是为了上课/练习,所以这可能不相关,但考虑到拥有物品的租赁历史通常非常有用。因此,您可能不想删除租用的记录,而只是将项目标记为已退回。

考虑:

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

RentalReturned您可以通过它的字段是否存在来查看任何单个项目是否null存在。如果它是非空的,那么你知道该项目已经回来了,现在你可以汇总租赁数据以查看它多久出去一次,平均租赁时间是多少等等。你必须建立一些检查来进行确保您没有租用比实际拥有的项目更多的副本以及其他类似的东西,但我认为这总体上是一个更灵活的模式开始。你正在做的事情也可能过于复杂,但我至少想提出这个想法。

于 2009-11-26T04:20:45.400 回答
0

您真的要删除rentedMovie 实例吗?你将如何报告一个人租了多少部电影等?

我建议稍微重新考虑你的模型。作为第一步,您需要在某个地方存储人员数据、在某个地方存储项目数据以及在某个地方存储人员/项目数据。

现在先忽略电影和游戏之间的区别——一旦你定义了你的底层结构,这就会成为一个标准化的过程。

作为一个简单的起点,您应该拥有:

人 1..1 ---- 1..* 雇用 0..* ---- 1..1 项目

其中 Hires 表是另外两个表之间的链接表,其组合键由 personID、ItemID 和某些描述的时间戳(以允许重新租用同一部电影)组成。

然后,您可以查看为项目类型等设置一个单独的表。

于 2009-11-26T04:21:43.680 回答
0

首先要考虑的是,一部电影实际上是两个实体,标题和媒体。标题是“指环王”,而媒体是你带回家的 DVD。一个标题可以有多个媒体(副本),而一个媒体有一个标题。Rental每个媒体租赁表都有一行,每次在租赁时扫描条形码时,该表都会获得一个新行,而DateReturned在返回时填充。Status表中的字段Media跟踪每个光盘/游戏的输入/输出状态。如果您觉得需要跟踪哪些电影是一起租给客户的,您可能会在DateRented(datetime)之前找到它,或者在表中 添加ReceiptNumber或。ShoppingBasketIDRental

gamerental_model_01

于 2009-11-26T05:19:53.050 回答