MySQL:几个父母从一张桌子上识别他们的孩子

时间:2009-11-21 11:30:04

标签: mysql database-design

我正在为旅游网站设计数据模型。我有地方(国家,度假村,酒店)的表格和旅游的表格。这些表在字段中非常不同,因此无法合并为一个。它们都有通常的auto_increment作为id。地方和旅游有照片所以有第三张照片表。此表有“父”字段,我计划在其中存储父(地方或旅游)ID。

设计这些表的最佳方法是什么?所有照片都有一张桌子,两张桌子作为照片的“父母”。现在我已经在照片表中添加了'parent_type'列,所以当我的脚本显示一个游览时,它会通过其(父)id来调用照片,并从照片表中键入(parent_type)'tour'

UPD: 有更优雅的解决方案吗?只有3个表而且没有'parent_type'列?

(无法发布图表......这里是链接http://share.xmind.net/yentsun/tourism-site-data-model/

3 个答案:

答案 0 :(得分:2)

国家,酒店和度假村是一个地方的子类型。地方表包含地方常用的所有字段,而国家,酒店和度假村表包含特定于每个字段的字段。一个旅游包含许多地方,一个地方可以是许多旅游的一部分。

placehotel_model_01

以下是Place和Country的示例代码 - 它是T-SQL,但您会明白这一点。

CREATE TABLE Place
( 
    PlaceID        int  NOT NULL ,
    Type                varchar(2) 
);

ALTER TABLE Place
ADD CONSTRAINT PK_Place PRIMARY KEY  CLUSTERED (PlaceID ASC)
;
ALTER TABLE Place
ADD CONSTRAINT FK1_Place FOREIGN KEY (ParentID) REFERENCES Place(PlaceID)
;

CREATE TABLE Country
( 
    PlaceID        int  NOT NULL 
);

ALTER TABLE Country
ADD CONSTRAINT PK_Country PRIMARY KEY  CLUSTERED (PlaceID ASC)
;
ALTER TABLE Country
ADD  CONSTRAINT FK1_Country FOREIGN KEY (PlaceID) REFERENCES Place(PlaceID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
;
评论后

更新 对不起,这张桌子最适合我。

placehotel_model_02

答案 1 :(得分:0)

前一段时间我的情况也一样。我为parent_type使用了'set'类型。永远不要存储您的类型的名称,使用整数,因为它们可以更快地读取。并在您的外键上放置索引。

答案 2 :(得分:0)

没有父母参与 - 你只有两个属性的照片 - 地方和旅游。

因此,使用带有两个外键的Photos表,一个用于Tour,另一个用于Place。然后当然 一个Tours表和一个Places表。

如果您需要知道哪些Tours去了哪个地方,请直接使用Tour_Places表进行处理 这是独立的。

对于“父母”,此解决方案仍然允许您为游览(或地点)识别哪些照片相关联。