单表继承还是两个表?

时间:2009-04-03 21:14:52

标签: sql database database-design sti

假设我有一个包含以下列的表格(单词列表):

word: varchar
contributor: integer (FK)

现在,假设我想为每个“单词”翻译。什么是最好的?有第二张桌子?

word: integer (FK)
translation: varchar
contributor: integer (FK)
lang: integer (FK)

或者在同一张桌子上?

word: varchar
translation_for: integer (FK - to the same table)
contributor: integer (FK)
lang: integer (FK)

假设有两种情况,(1)我需要将翻译后的单词与翻译后的原始单词一起提取,(2)我需要将翻译成单词。在这两种情况下,我都会更多地使用“原始”单词( SELECTing UPDATEING / INSERTING )。

那么,对于每种情况,或者一般情况下,哪种方法最佳?我倾向于第一种方法,因为那时我的“默认”SELECT不必由 lang 列限定。你觉得怎么样?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您现在想要不对数据库进行规范化,如果您想稍后添加语言,我认为您会受到伤害。 有一个单词表,其中单词是默认语言。它有一个ID。 拥有一个带有ID的语言表(即西班牙语,2),以及一个包含单词ID,语言ID以及该语言中实际单词的翻译表。这是链表。

使用视图查询,但对于插入和更新,根据您的DBMS,您可能需要进行硬查询。

这只是假设您正在尝试提供本地化,因此可能会在以后添加更多语言。这样做比每次添加语言时修改数据库以添加列更容易。 如果你真的只需要一个翻译并且非常怀疑你将需要另一个翻译,那么只需添加一列即可。

答案 1 :(得分:0)

由于您似乎希望“单词”具有与“翻译单词”分开的标识,因此1认为第1个选项可以更好地满足您的需求。

通常情况下,我认为设计更像是:

PK (Key (varchar), Lang (FK)), Word (nvarchar)

会更合适 - 你只能通过它的Key和Lang值来引用文本。但是,看起来你正在用“原始单词”替换Key - 所以这使它略有不同。