关于数据库建模的问题

时间:2008-12-02 09:17:43

标签: database database-design entity-attribute-value

您如何在数据库中建模这些关系?

您有一个可以包含PageElements的Page实体。

PageElement例如可以是文章或图片。文章表显然有其他成员/列而不是图片。一篇文章就可以了。所有类型为nvarchar的“Title”,“Lead”,“Body”列,而Picture可能具有类似“AltText”,“Path”,“Width”,“Height”的内容。我喜欢这个是可扩展的,谁知道在3个月内我可能需要什么PageElements?所以我想我需要一个PageElementTypes表。

对于关系,这些表如何:

页面,带有ID和其他mumbo jumbo。 (创建日期,可见,不是)

带有PageId和PageElementId的

Pages_PageElements

带有Id和PageElementTypeId以及更多mumbojumbo的

PageElements (SortOrder,Visibility等)。

带有ID和名称的

PageElementTypes (例如“Article”,“Picture”,“AddressBlock”)

现在,我应该在每个Articles,Pictures,AddressBlocks表中创建一个PageElementId列来完成任务吗?这就是我有点卡住的地方,这是一个简单的1:1关系所以这应该有效,但不知怎的,我可能会错过一些东西。

跟进:

下面推荐的具有单独属性的解决方案会强制我将所有属性存储为相同的类型吗?如果一个PageElement的属性为nvarchar(255),而某些属性为nvarchar(1000),那么如果某些是整数呢?

如果我得到EAV方式,我将不得不创建大量的表来保存所有不同数据类型的属性值。

5 个答案:

答案 0 :(得分:2)

两个常见的选择是Single Table InheritanceMulti Table Inheritance。其他方法包括我从未使用的tables for each concrete class,以及我称之为元表实现的方法,其中属性定义被移动到数据而不是任何类型的模式。

我对STI有一般的良好体验,并且如果您不期望过多的课程和属性,那么这是最简单的解决方案。我的书很简单。

除非用户在运行时需要创建新的页面元素类型,否则我会避免使用元表格方法和任何看起来像它的东西。根据我的经验,这些代码很快就变成了一个泥潭,与开发人员定期更新的更具体的实现相比,很少提供很多价值。

答案 1 :(得分:1)

正如您已配置页面元素一样,您需要配置与页面元素关联的属性

所以我们有两个可扩展的页面元素和一个项目。他们的属性。

我建议如下表格:

页面:页面ID | ...

页面元素:页面元素ID |元素类型ID |页面ID | ...

页面元素类型:元素类型ID |页面元素类型标签

页面元素属性类型:属性类型ID |元素类型ID |属性标签

页面元素属性:页面元素ID |属性类型ID |属性值

页面元素属性类型表将包含与元素关联的属性列表。示例:

Atttibute Type ID 1 |文章| “标题”

Atttibute Type ID 2 |文章| “铅”

Atttibute Type ID 3 |图片| “AltText”

页面元素属性表将存储与页面元素相关的属性的实际值。示例:

页面元素ID 1 |属性类型ID 1 | “每个人都喜欢雷蒙德”

页面元素ID 2 |属性类型ID 3 | “世界地图”

答案 2 :(得分:0)

通用的解决方案是:

PageElementType: ID, Name, [Mumbo Jumbo]
PageElementTypeParameter: ID, PageElementTypeID, [Mumbo Jumbo]
Page: ID, [Mumbo Jumbo]
PageElement: ID, PageElementTypeID, [Mumbo Jumbo]
PageElementParameters: ID, PageElementID, PageElementTypeParameterID, Value, [Mumbo Jumbo]

在人类的话语中:有一个页面元素类型表和一个关联表,它列出了每个页面元素的可能参数(如图像的SRC和ALT;文章的TEXT等)。

然后有一张包含所有页面的表格;一个关联表,列出每个页面中的元素;以及列出每个元素的参数值的表。

答案 3 :(得分:0)

我使用了不同的命名约定,但这基本上就是我要做的事情:

PageElementType(PageElementTypeID,PageElementTypeName)

PageElement(PageElementID,PageElementTypeID)

文章(ArticleID,PageElementID,...)

图片(PictureID,PageElementID,...)

页面(PageID,...)

PageHasPageElement(PageHasPageElementID,PageID,PageElementID)=> {PageID,PageElementID}是唯一的

这就是我所做的,并且看起来相当规范并且表现良好。

答案 4 :(得分:0)

我想我会跟我得到的东西一样,EAV对我来说别无选择。我现在得到的是一种混合方式。