我正在为旅游网站设计数据模型。我有地方(国家,度假村,酒店)的表格和旅游的表格。这些表在字段中非常不同,因此无法合并为一个。它们都有通常的auto_increment作为id。地方和旅游有照片所以有第三张照片表。此表有“父”字段,我计划在其中存储父(地方或旅游)ID。
设计这些表的最佳方法是什么?所有照片都有一张桌子,两张桌子作为照片的“父母”。现在我已经在照片表中添加了'parent_type'列,所以当我的脚本显示一个游览时,它会通过其(父)id来调用照片,并从照片表中键入(parent_type)'tour'。
UPD: 有更优雅的解决方案吗?只有3个表而且没有'parent_type'列?
(无法发布图表......这里是链接http://share.xmind.net/yentsun/tourism-site-data-model/)
答案 0 :(得分:2)
国家,酒店和度假村是一个地方的子类型。地方表包含地方常用的所有字段,而国家,酒店和度假村表包含特定于每个字段的字段。一个旅游包含许多地方,一个地方可以是许多旅游的一部分。
以下是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
;
评论后
答案 1 :(得分:0)
前一段时间我的情况也一样。我为parent_type使用了'set'类型。永远不要存储您的类型的名称,使用整数,因为它们可以更快地读取。并在您的外键上放置索引。
答案 2 :(得分:0)
没有父母参与 - 你只有两个属性的照片 - 地方和旅游。
因此,使用带有两个外键的Photos表,一个用于Tour,另一个用于Place。然后当然 一个Tours表和一个Places表。
如果您需要知道哪些Tours去了哪个地方,请直接使用Tour_Places表进行处理 这是独立的。
对于“父母”,此解决方案仍然允许您为游览(或地点)识别哪些照片相关联。