首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -多到多的关系,或一对多的附加列

MySQL -多到多的关系,或一对多的附加列
EN

Database Administration用户
提问于 2021-01-17 09:48:47
回答 2查看 455关注 0票数 0

我们的产品包含一些约束,使我们考虑哪种表的设计将产生最佳的性能。

我们的模型:

  • 试题表,其中包含id、body、难易度和标签等字段。
    • 每个问题最多可以有五个不同的标签。

  • 标签表,它包含像id和标记名称这样的字段。

试题表的读量要比写的要多得多。

我们考虑了两个设计方案:

  1. 很多到许多关系,我们将有以下表格
  • 问题- TagsQuestion -标签
  1. 一对多的关系,我们将有下面的表格
  • 问号

在此选项中,试题表将包含五个标记列(TagA、TagB等)

“读取”查询主要通过标记或标记获取问题。

EN

回答 2

Database Administration用户

发布于 2021-01-17 14:08:59

基本上你只能用

代码语言:javascript
复制
Question - TagsQuestion - Tags

对于桥接器表,如果一个标记被设置为许多问题。

如果你有很多问题的话,它也节省了一些空间。

sencond选项有一个问题,即如果不显示所有标记,则每个标记都需要五个内部联接,而对于第一个选项,则可以使用两个联接进行相同的查询。

总的来说,使用桥接器表的第一个选项是更灵活和空间消耗更大的选项。

票数 0
EN

Database Administration用户

发布于 2021-01-17 18:36:38

“标签”本质上是对还是错?它们是预先定义的吗?(也就是说,您以后不太可能添加新的标志。)如果是这样的话,一个紧凑的存储方式是

代码语言:javascript
复制
CREATE TABLE ...
    tags SET('approved', 'sold', 'built', 'answered', 'lost') NOT NULL

测试标志(S)有多种功能,特别是FIND_IN_SET()

(如果你给我们一些可能的标签名,会有帮助的。)

或不多对多

上次实现“标记”功能时(使用您的术语):

代码语言:javascript
复制
CREATE TABLE tags (
    question_id MEDIUMINT UNSIGNED NOT NULL,
    tag  VARCHAR(55) NOT NULL,
    PRIMARY KEY(question_id, tag),
    INDEX(tag, question_id)
) ENGINE=InnoDB;

PK使查找给定问题的标记具有表现力;二级索引使查找哪些问题具有特定标记的效率更高。这种方法扩展得很好,比3表方法更简单。无限数量的标签是可能的;缺点是拼写错误不会被捕获。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/283411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档