1-多-多的数据库结构

发布于 2024-10-19 10:43:22 字数 952 浏览 1 评论 0 原文

我需要一些想法如何处理我正在开发的网站的数据库结构,我已经绞尽脑汁有一段时间了,以找出设计表格以帮助其实现可扩展的最佳方法。以下是详细信息。

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

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

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

    制作人:Sunrise、Bones

  • 额外字段:每个列表可以有也有额外的字段示例:

    播出日期: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)

这个结构可以吗?另外,有效查询所有这些信息的最佳方法是什么?我认为根本不可能在一次查询中获得所有这些信息。我有什么选择?

此外,每个列表将加载多个线程,并且这些线程内将包含多个帖子,所有帖子都在同一页面上,有点像:

[单页]

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

  • 线程 1
    • 帖子 1
    • 帖子 2
  • 主题 2
    • 帖子 1
    • 帖子 2

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

I need some ideas how to handle the database structure for a site i'm working on, i have been whacking my brains over it for a while to figure out the best way to design the tables to help it become scalable. Here are the details.

  • Listing: A single post with title text, post date and simple other info. Will Connect with user table to get username.

  • Tags: Each listing can have several tags belonging to a 'type' Example:

    Genre: Action, Supernatural, Comedy

    Producers: Sunrise, Bones

  • Extra Fields: Each listing can have extra fields too Example:

    Air Dates: 18th Dec 2010

    Duration: 120 mins

The Normalized way would be something like:

-- 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)

Would this structure be fine ? Also what would be the best way to query all this information efficiently. I don't think its possible at all to get all this in one query. what are my options?

Also each listing will load multiple threads and inside those threads will be multiple posts, all on the same page kinda like:

[SINGLE PAGE]

Listing (title, content, tags, extra fields)

  • Thread 1
    • Post 1
    • Post 2
  • Thread 2
    • Post 1
    • Post 2

Thanks for everyone who helps, I really would appreciate some insight you all. If there is anything further I can add to help you help me please ask. I can dump my SQL structure.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

短叹 2024-10-26 10:43:22

无论您的目标是可扩展性还是性能,您几乎肯定会后悔这一点:

-- Field_table (list_id, field_name, field_value)

有关某些具体原因,请参阅 SQL 反模式反击。该结构从幻灯片 16 开始。另请阅读 Bad CaRMa,这与可扩展性和性能有关。

Whether you're aiming for scalability or performance, you'll almost certainly regret this:

-- Field_table (list_id, field_name, field_value)

For some of the specific reasons, see SQL Antipatterns Strike Back. This structure starts on slide 16. Also read Bad CaRMa, which has to do with both scalability and performance.

逆光下的微笑 2024-10-26 10:43:22

这看起来像是典型的实体属性值方法。这个模型很好,特别是对于高流量网站,但它不太适合 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 是一种权衡,您将数据库主要用于持久存储,较少用于逻辑和报告生成。

This looks like a typical entity-attribute-value approach. This model is fine, especially for high traffic websites, but it does not lend itself well to SQL. Instead of:

select * from Listing_table where postdate > '2011-02-01'

You'll find yourself writing queries like:

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'

And that's just for a simple date compare. This gets complex really really fast.

Basically, EAV is a tradeoff where you use the database mostly for persistant storage and less for logic and report generation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文