MySQL数据库结构:更多列还是更多行?

MySQL数据库结构:更多列还是更多行?,mysql,database-design,data-structures,Mysql,Database Design,Data Structures,我正在创建一个在线词典,为此我必须使用三种不同的词典:日常用语、化学用语、计算机用语。我有三个选择: 1) 创建三个不同的表,每个字典一个表 2) 创建一个包含额外列的表,即: id term dic_1_definition dic_2_definition dic_3_definition ---------------------------------------------------------------------- 1 term1 defin

我正在创建一个在线词典,为此我必须使用三种不同的词典:日常用语、化学用语、计算机用语。我有三个选择:

1) 创建三个不同的表,每个字典一个表

2) 创建一个包含额外列的表,即:

id    term    dic_1_definition    dic_2_definition    dic_3_definition
----------------------------------------------------------------------
1     term1   definition
----------------------------------------------------------------------
2     term2                       definition
----------------------------------------------------------------------
3     term3                                           definition
----------------------------------------------------------------------
4     term4                       definition
----------------------------------------------------------------------
5     term5   definition                              definition
----------------------------------------------------------------------
etc.
3) 创建一个带有额外“标记”列的表,并根据其字典标记所有术语,即:

id    term     definition    tag
------------------------------------
1     term1    definition    dic_1
2     term2    definition    dic_2
3     term3    definition    dic_3
4     term4    definition    dic_2
5     term1    definition    dic_2
etc.
一个术语可以与一个或多个词典相关,但定义不同,比如说,日常使用的术语可能与IT领域的相同术语不同。这就是为什么term1(在我的上一张表中)可以分配两个标记-
dic_1
(id 1)和
dic_2
(id 5)

将来我会添加更多的字典,所以可能会有三个以上的DIC。我想如果我使用选项2(带有额外的列),我将在将来得到一个表和许多列。我不知道这对性能是否有害

在我的案例中,哪种选择是最好的方法?哪一个更快?为什么?如有任何建议和其他选择,我们将不胜感激


谢谢。

数据正常化。。我将使用3,那么您不必进行任何复杂的查询来确定每个给定术语有多少定义适用于数据规范化。。我会选择3,那么您不必进行任何复杂的查询来确定每个给定术语适用多少定义。选项3听起来是最适合您的场景的选择。它使查询变得更简单,并且从长远来看肯定更易于维护

选项2肯定不是一个好办法,因为最终会有很多空值,对这样的表编写查询将是一场噩梦

选项1不错,但在应用程序可以查询之前,它必须欺骗要查询的表,这可能是一个问题

因此,选项3将产生如下简单查询:

Select term, definition from table where tag = 'dic_1'

您甚至可以创建另一个标记表来保存有关标记本身的信息。

选项3听起来是最适合您的场景的选择。它使查询变得更简单,并且从长远来看肯定更易于维护

选项2肯定不是一个好办法,因为最终会有很多空值,对这样的表编写查询将是一场噩梦

选项1不错,但在应用程序可以查询之前,它必须欺骗要查询的表,这可能是一个问题

因此,选项3将产生如下简单查询:

Select term, definition from table where tag = 'dic_1'
您甚至可以创建另一个标记表来保存有关标记本身的信息

2) 创建一个带有额外列的表

你绝对不应该使用第二种方法。如果将来你决定要10本字典怎么办?你必须再创建10列,这太疯狂了

您应该做的是为所有词典创建一个表,为所有术语创建一个表,为所有定义创建一个表,这样所有数据都会以逻辑方式分组在一起

然后,您可以为每个词典创建一个唯一的ID,该ID在术语表中引用。然后,您所需要的只是一个简单的查询,以获取特定词典的术语

2) 创建一个带有额外列的表

你绝对不应该使用第二种方法。如果将来你决定要10本字典怎么办?你必须再创建10列,这太疯狂了

您应该做的是为所有词典创建一个表,为所有术语创建一个表,为所有定义创建一个表,这样所有数据都会以逻辑方式分组在一起


然后,您可以为每个词典创建一个唯一的ID,该ID在术语表中引用。然后,您只需要一个简单的查询就可以获得特定词典的术语。

我认为您应该有一个词典类型的查找表

字典类型(DTId、DTName)

还有一张桌子吗

术语(TermID,TermName)

那么你的定义呢

定义(定义ID、术语ID、定义、DTId)


这应该行。

我想你应该有一个字典类型的查找表

字典类型(DTId、DTName)

还有一张桌子吗

术语(TermID,TermName)

那么你的定义呢

定义(定义ID、术语ID、定义、DTId)

这应该行得通。

总有一个“视情况而定…”

话虽如此,从纯粹主义的角度(数据规范化)和实际的角度来看,选项2通常是一个糟糕的选择,您必须更改表定义以添加新词典(或删除旧词典)

如果您的主要访问总是要寻找匹配的术语,并且字典名称(“每日”、“化学”、“极客”)是一个属性,那么选项3是有意义的

另一方面,如果您的访问总是主要通过字典类型和术语进行,并且字典1很大但很少使用,而字典2..n很小但通常使用,那么选项1可能更有意义(或者选项1a=>1表用于很少使用的字典,另一表用于大量使用的字典)。。。这是一个非常假设的情况

总是有一个“视情况而定…”

话虽如此,从纯粹主义的角度(数据规范化)和实际的角度来看,选项2通常是一个糟糕的选择,您必须更改表定义以添加新词典(或删除旧词典)

如果您的主要访问总是要寻找匹配的术语,那么字典名称('Daily','ch