2008-12-02 94 views
2

你会如何在db中建立这些关系?关于数据库建模的问题

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

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

对于关系,那这样的表:

网页一个ID,和其他魔神。 (创建日期,可见,什么不该)

Pages_PageElements用的PageId和PageElementId。

PageElements带有Id和PageElementTypeId以及更多的mumbojumbo(SortOrder,Visibility等)。

PageElementTypes用一个ID和一个名称(如“条”,“图片”,“AddressBlock”)

现在,我应该建立在每一个第一个PageElementId列,图片,AddressBlocks表完成东西了吗?这是我有点卡住,这是一个简单的1:1关系,所以这应该工作,但不知何故,我可能会错过一些东西。

追问:

下面设有独立的属性会强迫我的所有属性存储为同一类型,或不推荐的解决方案?如果一个PageElement的属性是nvarchar(255),而其中一些属于nvarchar(1000),那么如果某些是整数?

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

回答

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用于图像;文章的文字等)。

然后是所有页面的表格;一个列出每个页面中的元素的关联表;和一个列出每个元素参数值的表格。

+0

This Works。这基本上是实体属性值(EAV)。它有优点和缺点。 – BobbyShaftoe 2008-12-02 09:26:28

+0

这不需要所有的参数都是相同的类型吗? – kitsune 2008-12-02 09:36:13

+0

有办法。首先,如果你使用MSSQL,使用nvarchar(MAX),否则检查你的DBVS。其次,对于int/datetime/decimal /等,在同一个表中创建几个列。对于每个记录,只填写一个。 – 2008-12-02 10:16:30

0

我用不同的命名约定,那么你不过这基本上是我会做什么:

PageElementType(PageElementTypeID,PageElementTypeName)

PageElement(PageElementID,PageElementTypeID)

条(条款ArticleID,PageElementID ,...)

图片(PictureID,PageElementID,...)

页(PAGEID,...)

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

这是我做的,似乎是相当好标准化和表现良好。

1

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

因此,我们有两个项目是可扩展的页面元素&它们的属性。

我sugges如下表:

:页ID | ...

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

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

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

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

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

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

Atttibute类型ID 2 |文章| “Lead”

Atttibute Type ID 3 |图片| “AltText”

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

页面元素ID 1 |属性类型ID 1 | “人人都爱雷蒙德”

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

2

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

我对STI总体上有很好的经验,并且假设您不期望过多的类和属性,它是最简单的解决方案。简单在我的书里非常好。

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

0

我想我会随我得到的,EAV对我来说是没有选择的。我现在得到的是一种有点混合的方法。