1-many-many的数据库结构

时间:2011-02-27 14:09:47

标签: mysql sql database-design database-schema

我需要一些想法如何处理我正在处理的网站的数据库结构,我一直在绞尽脑汁一段时间找出设计表的最佳方法,以帮助它变得可扩展。以下是详细信息。

  • 列表:包含标题文本,发布日期和简单其他信息的单个帖子。将与用户表连接以获取用户名。

  • 标签:每个列表都可以有多个属于“类型”的标签示例:

    类型:动作,超自然,喜剧

    制片人:日出,骨头

  • 额外字段:每个列表也可以包含额外字段示例:

    航空日期: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]

列表(标题,内容,标签,额外字段)

  • 线程1
    • Post 1
    • Post 2
  • 线程2
    • Post 1
    • Post 2

感谢所有帮助的人,我真的很感激你们所有人的见解。如果还有什么我可以添加来帮助你帮助我请问。我可以转储我的SQL结构。

2 个答案:

答案 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是一种权衡,您可以将数据库主要用于持久存储,而不是逻辑和报告生成。