【问题标题】:What is right table design and proper searching queries for my database?什么是我的数据库的正确表设计和正确搜索查询?
【发布时间】:2012-12-12 03:58:29
【问题描述】:

我尝试为以下目的设计 mysql 表。该站点是关于属于一个或多个主题的任何主题和项目 - 例如让我们以“蝙蝠侠”为主题。为此,有几个类别的项目 - 电影书籍视频游戏汽车(Batmobil) .类别数为 10-20。我的想法是制作这些表格:

Topic
-------
id
name

Item
-------
id
name
category_id
decscription and some other common columns

Movie (and other categories, like Car, VideoGame, Book,...)
-------
id
item_id 
specific columns for each category

Item_Topic (and other tables like Item_Category, Item_Movie, Item_Car, Item_Videogame, Item_Person...)
-------
item_id
topic_id (movie_id, car_id, person_id, ...)

Person
-------
item_id
name
role

到目前为止,我认为这是一个很好的解决方案(或者我错了吗?)

但我的两个问题如下:

  1. 我的表格设计中的电影演员和书籍作者不被视为项目。对于演员和作家,有一个表 PersonItem-Person 表用于将项目与人联系起来。但是,如果主题是“斯蒂芬·金”呢?我应该如何搜索斯蒂芬·金为他写的场景的书籍和电影?我想到的唯一方法是改变桌子设计并将人也视为物品。这是个好主意吗?这个问题的表设计解决方案是什么?您能否告诉我,使用适当的表格设计匹配主题和项目的一般查询应该是什么样的?

  2. 我想显示所有项目的详细信息(存储在 MovieBookVideoGame 中...)属于一页上的一个主题 - 我可以使用的最佳查询是什么?

非常感谢您的任何回答!

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    让我评论一下你的这部分设计:

    Movie (and other categories, like Car, VideoGame, Book,...)
    -------
    item_id 
    specific columns for each category
    

    这通常不是使用关系模型的最佳方法。如果可能,最好有一个Category 表,其中包含MovieCarVideoGameBook 等的记录。这样更容易根据需要添加新类别。

    如果商品数据因类别而有很大差异,则有一些技术可以处理这种情况,但它并不漂亮(通常是商品属性表,然后您的商品表是属性到值的映射表)。

    更新

    感谢@RichardCZ 提醒我属性映射方法叫EAV, Entity–attribute–value, model

    【讨论】:

    • 我编辑了 ID 和 Category 表,我使用了类似的方法(ID => CategoryName 的数组而不是 Category 表),但是这个可能更好。在答案的第二部分中,您是在谈论 EAV 模型之类的东西吗?我认为对于我的情况(具有严格定义的“列”的几个类别,添加/编辑类别将很少见),几个表都可以。谢谢
    • 是的,EAV 型号。在我的答案中添加了维基百科链接。谢谢。
    猜你喜欢
    • 2019-05-28
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多