我目前正在构建一个使用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)在同一个表中包含所有类型的所有字段,只是使特定字段可以为空(我不喜欢这个解决方案,因为它看起来很乱)。
有什么想法吗?
我怀疑我不能成为第一个遇到不同实体类型/字段引用问题的人,具体取决于某种类型。
我们非常感谢您的想法。
答案 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;
这是一个丑陋的查询,但它应该做你想要的......