我需要一些想法如何处理我正在处理的网站的数据库结构,我一直在绞尽脑汁一段时间找出设计表的最佳方法,以帮助它变得可扩展。以下是详细信息。
列表:包含标题文本,发布日期和简单其他信息的单个帖子。将与用户表连接以获取用户名。
标签:每个列表都可以有多个属于“类型”的标签示例:
类型:动作,超自然,喜剧
制片人:日出,骨头
额外字段:每个列表也可以包含额外字段示例:
航空日期:2010年12月18日
持续时间:120分钟
规范化的方式类似于:
- Listing_table(list_id,user_id,list_title,list_content,list_date)
- Tags_table(tag_id,tag_type,tag_name,tag_slug)
- Tags_Listing_table(list_id,tag_id)
- Field_table(list_id,field_name,field_value)
这种结构会好吗?还有什么是有效查询所有这些信息的最佳方式。我认为根本不可能在一个查询中得到所有这些。我有什么选择?
此外,每个列表都会加载多个线程,并且这些线程内部将是多个帖子,所有这些都在同一页面上有点像:
[SINGLE PAGE]
列表(标题,内容,标签,额外字段)
感谢所有帮助的人,我真的很感激你们所有人的见解。如果还有什么我可以添加来帮助你帮助我请问。我可以转储我的SQL结构。
答案 0 :(得分:2)
无论您的目标是可扩展性还是性能,您几乎肯定会后悔:
-- Field_table (list_id, field_name, field_value)
出于某些具体原因,请参阅SQL Antipatterns Strike Back。此结构从幻灯片16开始。另请阅读Bad CaRMa,这与可伸缩性和性能有关。
答案 1 :(得分:0)
这看起来像是典型的entity-attribute-value方法。这种模式很好,特别是对于高流量的网站,但它不适合SQL。而不是:
select * from Listing_table where postdate > '2011-02-01'
您会发现自己编写的查询如下:
select *
from Listing_table lt
where (select value from field_table ft where lt.list_id = ft.list id
and field_name = 'postdate') > '2011-02-01'
这只是一个简单的日期比较。这变得非常复杂。
基本上,EAV是一种权衡,您可以将数据库主要用于持久存储,而不是逻辑和报告生成。