具有不同内容的concat表

时间:2010-07-19 19:23:09

标签: php sql mysql database database-design

我目前正在构建一个使用PHP和MySQL发布故事的小型Web应用程序。每个故事可能是一篇文章(包含大量字段和数据),只是一个超链接/网址,只是一个图像,或一个具有某些属性的可下载文件(再次包含大量字段)。

我的问题与找到系统的最佳数据库布局有关。我已经考虑了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)在同一个表中包含所有类型的所有字段,只是使特定字段可以为空(我不喜欢这个解决方案,因为它看起来很乱)。

有什么想法吗?

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

我们非常感谢您的想法。

4 个答案:

答案 0 :(得分: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
...

答案 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

答案 2 :(得分:1)

您只有很少的字段,只需将它们全部放在一个表中并添加一个类型字段即可。毫无疑问会让事情过于复杂。

答案 3 :(得分:1)

我会在每个表中添加一个'type'列,指定它来自哪个表,然后执行equijoin后跟一个组:

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;

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