MySQL中的类层次结构

时间:2013-03-09 02:56:42

标签: mysql database-design database-schema

我正在创建服装店,因此我正在创建画廊功能,其中包括两种类型:产品库和lookbook库。产品库只是单一产品的图片,而lookbook画廊是包含多种产品的图片。

到目前为止,我有一个简化的UML图,有点像这样

Gallery classes UML diagram

我不确定如何将其转换为MySQL表格。我试过了,我想出了类似的东西

Gallery database UML diagram

但这对我来说似乎有点过分和闻起来很有趣。在我的情况下,最佳做法是什么?我是在正确的轨道还是我错了?

3 个答案:

答案 0 :(得分:2)

首先考虑继承是否是实现所需行为的最佳方式。通常最好prefer composition over inheritance。从你的图表中我会说你根本不需要继承来解决你的问题。

如果确实需要实现继承,那么可以使用许多策略。寻找对象关系映射器是一个非常好的主意,因为一个好的人可以更容易地实现下面的策略。如果你使用.NET,那么NHibernateEntity Framework是不错的选择。对于Java Hibernate非常好。

每个类层次结构的表

在这里,您将为整个类层次结构创建一个表。这最有意义 当层次结构中的类都共享许多列时。您需要添加“discriminator”列,以便您可以识别每行属于哪个子类。在你的例子中你有

  • 图片

我认为这个策略对你来说最有意义,因为你的子类之间似乎没有很多不同的列。

每个子类的表

在此示例中,您将为每个子类创建一个表。当继承层次结构中的类不共享许多公共列时,这是最有意义的。

所以你有这样的表:

  • product_gallery
  • logbook_galleries
  • product_picture
  • logbook_picture

每个班级的表格

这是图表中的策略。像table per-subclass一样,当每个子类具有不同的列时,这很有用。每个子类表的优点是在一个大连接中查询整个类层次结构更容易,缺点是最终会有很多表。

答案 1 :(得分:1)

我不知道“最佳实践”是什么,你可以使用NO-SQL数据库,或者如果你使用关系数据库,你可以使用3个表,画廊,图片和产品。

图库可以包含许多图片

图片可以包含许多产品。

画廊类型之间的区别仅包含在属性中。

答案 2 :(得分:0)

该数据库架构看起来注定要失败。定义模式时最重要的事情是从问题的名词和动词开始。用语言描述您的环境是什么样的。有哪些实体?实体如何相互作用?例如,“画廊有图片”。仅此声明就告诉您画廊和图片之间存在关联。

一旦你想出了你的名词 - 动词关联,你就可以开始说明诸如“画廊”和“图片”之类的实体。画廊和图片之间是否有一对一的关系,或者有多个图片库?

请考虑这些事情,并在此处查看一些基本设计提示:http://msdn.microsoft.com/en-us/library/b42dwsa3(v=vs.71).aspx