关系数据库表

时间:2009-11-26 03:20:06

标签: sql asp.net-mvc linq-to-sql database-design relational-database

我目前正在为一个软件工程类开发一个ASP.Net MVC项目。我的目标是创建一个小型的在线游戏租赁系统。我目前有3张桌子,电影,游戏和注册人;我正在使用LINQ-to-SQL将每个表定义为我的模型的类。到目前为止,我已经为电影和游戏创建了模型,在创建注册人模型时我想要做的是创建注册人与电影和游戏之间的关系。到目前为止,我所尝试的是在ID(注册人表中的主键)和电影和游戏中的注册者ID字段之间定义外键。我意识到如果我要删除注册人的实例,它将从其他表中删除相关的电影和/或游戏。我正在考虑做的是创建两个单独的模型来定义rentedGames和rentedMovies,并在这些模型和游戏和电影表之间建立关系,以便尝试模拟注册人从商店租借/返回/购买电影或游戏。

摘要:

到目前为止我所拥有的:

  • 3张桌子:注册人,电影和 游戏。
  • 我的LINQ-to-SQL模型 电影和游戏库存。

我正在尝试设置:

  • 租用/退回电影和/或游戏的注册人的模型,当租借/返回游戏时,在库存中的项目旁边放置一个标记以指示其状态。

问题:

  • 将单独的表添加到模型中 租来的电影/游戏会阻止物品 在我的库存模型中定义 被删除?即,当客户返回租借的电影时,租借的电影实例将被删除,但电影库存中没有电影。

  • 有没有相关的东西 表上设置了状态标志的表 相关的条目,而不是 条目被删除,无论何时 另一个表中的相关条目 被修改?? ??即,当客户返回租借的电影时,租借的电影实例会在电影中设置一个标志,表示它可以出租,然后删除租借的电影实例。

5 个答案:

答案 0 :(得分:1)

我会对此有所不同。首先,是否有理由将MovieGame视为单独的实体?为什么没有RentableItem可以是电影,游戏,游戏机,蓝光播放器等等?您可以通过item_id字段对其进行关键,它会包含预期的元数据(titletypegenrerental_class, and so on). 然后,您需要模拟Registrant租用一个或多个RentableItems的事实。这可以使用Rental表来完成,该表的每一行都将一个租用的RentableItem与特定Registrant相关联(即Rental由{{1}键入它有rental_id的外键和RentableItem.item_id的外键。Registrant.registrant_id也有截止日期,“返回”标志,租金价格等等。

然后你知道如果有一个Rental记录,其item_id与Rental相同且其“返回”标志为false,则RentableItem不在商店中。您永远不必修改RentableItem表本身,只需修改RentableItem表。

答案 1 :(得分:0)

你可以为rentedGames和rentedMovies创建单独的表,因为这个模型现在允许同时租用多个相同类型的电影或游戏,这肯定比只有一个实例更真实特定的电影或游戏。

当删除链接记录(rentedMovie,比如说)时,这将阻止删除父记录。但是,如果您将关系设置为“级联删除”,并且您允许原始电影或游戏表中的注册者字段可以为空,则不应该删除父电影。

回答你的第二个问题(我意识到假设任何特定标题只有一部电影/游戏):通常这样做的方式,如果你正在使用链接表,这是你想要做的,只是为了删除租借的电影/游戏记录。没有任何电影或游戏的链接记录是您的代码需要确定的,以便知道该电影或游戏现在可以出租(再次)。

答案 2 :(得分: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,您可以查看是否有任何单个项目。如果它是无效的,那么你知道该项目又回来了,现在你可以汇总租赁数据,看看它的出现频率,平均出租时间等等等。你必须建立一些检查来制作确定你没有租用比你实际拥有的项目更多的副本和其他类似的东西,但我认为这总体上是一个更灵活的模式开始。对于你正在做的事情,这也可能过于复杂,但我想至少提出这个想法。

答案 3 :(得分:0)

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

我建议稍微重新考虑你的模型。作为第一步,您需要在某处存储人员数据,某处存储商品数据以及存储人员/商品数据的位置。

暂时忽略电影和游戏之间的区别 - 一旦定义了基础结构,这就变成了规范化的过程。

作为一个简单的起点,你应该:

人1..1 ---- 1 .. *雇用0 .. * ---- 1件物品

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

然后,您可以查看项目类型等的单独表格。

答案 4 :(得分:0)

首先要考虑的是电影实际上是两个实体,标题和媒体。标题是“指环王”,而媒体是你带回家的DVD。一个标题可以有多个媒体(副本),而一个媒体有一个标题。 Rental表每个媒体租用都有一行,每次在租借时扫描条形码时,此表会获得一个新行,而返回时会填充DateReturnedStatus表中的Media字段跟踪每个光盘/游戏的输入/输出状态。 如果您认为需要跟踪哪些电影一起租给客户,您可能会发现DateRented(日期时间)或ReceiptNumberShoppingBasketID Rental }表。

gamerental_model_01