2010-07-19 81 views
2

我目前正在构建一个使用PHP和MySQL发布故事的小型Web应用程序。每个故事可以是一篇文章(有很多字段和数据),只是一个超链接/ url,只是一个图像,或者是具有特定属性的可下载文件(再次有很多字段)。具有不同内容的连续表

我的问题与找到系统的最佳数据库布局有关。我曾考虑过3种不同的解决方案,这些解决方案可能会也可能不起作用(字段仅仅是示例,不会因数据是否应存储在数据库中而受到影响):

1)为每个键入并且只是UNION他们。 E.g:

文章
id | date | title | author | preview | last_edited | category | content

超链接
id | date | title | author | url

图片
id | date | title | author | thumbnail | fullimg

文件
id | date | title | author | filetype | filename | filecontent

是否有可能创建一个SQL语句,以这种方式将每个字段添加到来自各个表的行中,并将各个行的“标记”类型取决于哪个表的来源?或者我必须解决的只是常见的领域(3-4字段将是相同的每个表),并为每个行的单独查找?

2)根据类型制作某种引用正确表和行的索引表?

索引
id | type | title | date | referenceid - >文章,超链接,图片或文件取决于“类型”字段。

使用外键时,这种方式有可能以某种方式吗?我怀疑没有,但是不确定你能在MySQL中做什么,不能做什么。

3)所有类型的所有字段在同一个表中,只是使特定字段为空(我不太喜欢这个解决方案,因为它看起来凌乱)。

任何想法?

我怀疑我不能成为第一个遇到引用不同实体类型/字段的问题,这取决于某种类型。

想法是高度赞赏。

回答

3

如果你命名字段,那么你可以非常容易地组合联盟,并且可以使用任何你喜欢的常量。我一直这样做:

Select id, 'articles' as tablename, title, author, 
    preview, last_edited, category, '' as url 
from articles 
UNION 
Select id, 'hyperlinks' as tablename, title, author, 
    '' as preview, '' as last_edited, '' as category, url 
From hyperlinks 
... 
+0

这样解决它的性能损失会是什么?我对找出可能的解决方案的不同优点和缺点非常感兴趣。 – agnsaft 2012-07-06 14:43:46

+0

联盟本身就很慢。对于SQL Server,UNION ALL要快得多 - 不确定mySQL。但是与其他数据库一样,性能取决于太多隔离因素。除非你处理数据库,否则我不希望这个查询成为瓶颈。 – Bill 2012-07-06 16:01:46

1

你有这么几个字段,只是把它们放在一个表中,并添加一个类型字段。没有意义,过于复杂的事情。

2

我建议添加一个stories表作为中心表。这为系统设计提供了极大的灵活性,并集中了故事核心数据。沿着这些线路

东西:

stories 
    id 
    date 
    title 
    author 
    article_id 
    hyperlink_id 
    picture_id 
    file_id 

articles 
    id 
    preview 
    last_edited 
    category 
    content 

hyperlinks 
    id 
    url 

pictures 
    id 
    thumb 
    full 

files 
    id 
    filetype 
    filename 
    filecontent 
+0

如果article_id与该特定条目不相关,那么是否会出现与外键相关的问题? – agnsaft 2012-07-06 14:46:26

+0

FKs可以为空 – Donnie 2012-08-07 21:41:42

1

我想补充一个“类型”列各指定什么表它是从哪里来的表,然后做一个等值连接跟着一群:

SELECT * 
FROM articles a INNER JOIN hyperlinks h 
    ON a.id =h.id AND a.date=h.date AND a.title=h.title AND a.author=h.author 
    JOIN pictures p ON h.id=p.id AND h.date=p.date AND h.title=p.title AND h.author=p.author JOIN files f 
    ON p.id=f.id AND p.date=f.date AND p.title=f.title AND p.author=f.author 
ORDER BY type; 

这是一个看起来丑陋的查询,但它应该做你想要的...

+0

以这种方式解决它会有什么性能损失? – agnsaft 2012-07-06 14:42:07

相关问题