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

时间:2009-11-30 12:59:46

标签: mysql database-design data-structures

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

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)创建一个带有额外“tag”列的表,并根据它的字典标记我的所有术语,即:

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

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

在我的情况下,哪种选择是最好的方法?哪一个更快?为什么?非常感谢任何建议和其他选择。

谢谢。

9 个答案:

答案 0 :(得分:6)

  

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

你绝对不应该使用第二种方法。如果您将来决定要10个词典,该怎么办?你将不得不另外创建10列疯狂..

您应该为所有词典创建单个表,为所有词语创建单个表,并为单个表创建单个表对于所有定义,以这种方式将所有数据以逻辑方式组合在一起。

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

答案 1 :(得分:5)

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

DictionaryType(DTId,DTName)

为您提供另一张表格

条款(TermID,TermName)

然后你的定义

差异(DifinitionId,TermID,定义,DTId)

这应该有用。

答案 2 :(得分:2)

选项3听起来似乎是适合您的方案的最佳选择。它使查询更简单,从长远来看肯定更易于维护。

选项2绝对不是要走的路,因为你最终会得到很多空值,而对这样的表编写查询将是一场噩梦。

选项1并不错,但在您的应用程序可以查询之前,它必须要求查询哪个表,这可能是个问题。

因此选项3将导致简单的查询,如:

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

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

答案 3 :(得分:2)

我开发了类似的项目,我的设计如下。在不同的表格中存储单词,定义和词典是一种灵活的选择,尤其是在将来添加新词典的地方。

alt text http://img300.imageshack.us/img300/6550/worddict.png

答案 4 :(得分:1)

数据规范化...我会选择3,然后您不必进行任何花哨的查询来确定每个给定术语适用的定义数量

答案 5 :(得分:1)

总有一个“它取决于......”

话虽如此,选项2通常是一个糟糕的选择 - 从纯粹的角度(数据规范化)和实际的角度来看 - 你必须改变表定义来添加新的字典(或删除旧字典)< / p>

如果你的主要访问权总是在寻找匹配的术语,而词典名称('daily','chemical','geek')是一个属性,那么选项3是有道理的。

另一方面,如果你的访问总是主要是字典类型和术语,字典1很大但很少使用,而字典2..n很小但常用,那么选项1可能更有意义(或选项1a =&gt; 1表用于很少使用的词典,另一个用于频繁使用的词典... ...这是一个非常假设的案例!

答案 6 :(得分:1)

您希望根据字典类型获取数据,这意味着字典类型是数据。

数据应位于表的字段中,而不是表名或字段名。如果您没有字段中的数据,那么您有一个数据模型,如果数据有机会需要更改,并且您需要动态创建查询以获取数据。

第一个选项使用字典类型作为表名。

第二个选项使用字典类型作为字段名称。

第三个选项正确地将字典类型作为数据放在字段中。

但是,术语和标记不应该是字符串,而应该是定义术语和字典类型的表的外键。

答案 7 :(得分:1)

您的数据库结构应该包含数据,结构本身不应该数据。这将立即排除选项2,除非您创建不同的表以构建在不同词典上运行的单独应用程序。如果他们被分享,那么这是错误的做法。

选项1需要对数据库进行修改并重写查询,以便添加新词典。它还为简单的查询增加了过多的复杂性,例如“这个词是什么词典?”

选项3这里是最灵活和最好的选择。如果您的数据变得太大,您最终可以使用表格分区等数据库端详细信息来加快速度。

答案 8 :(得分:0)

这里的要求太过模糊,导致“接受的答案”完全过度解决。这些要求需要提供有关如何使用字典的更多信息。

那就是说,解决了所提供的一点点;我会对#3进行修改。

  • 如果字典将完全独立使用,那么1号是完全可行的,并且提到共享术语概念的唯一原因是它恰好是巧合的可能性。
  • 沟2;它不必要地导致列中的NULL值,并且DB设计不喜欢它。
  • 3号是最好的,但是放弃了人工键,并键入Term + Tag。除了创建重复条目的可能性的人工密钥(通过Term + Tag)。如果没有其他表引用TermDefinitions,那么关键是浪费;如果有的话;然后他们说(例如)“我引用TermDefinition#3 ......呃,无论那是什么。:S”
  

简而言之,到目前为止,在要求中没有提供任何内容表明需要比选项3更复杂的任何内容。