具有动态行的动态列的关系数据库系统

时间:2011-09-14 04:39:36

标签: database-design matrix relational-database

脂肪酶, 我要像这样开发一个数据库,

enter image description here

在这里,我有一个单词列表。我需要保持数据库中每个其他单词的相关性。当添加一个新单词时,我需要能够添加一行和一列。

我对此的一个想法就是这样,

CREATE TABLE tbl_Words
(
      [WordID]      BIGINT          NOT NULL   IDENTITY(1,1),  // This s Primary Key
      [Word]        VARCHAR(250)    NOT NULL,                  // This s Unique..
)


CREATE TABLE tbl_WordRelevancy
(
      [RelID]       BIGINT          NOT NULL   IDENTITY(1,1),   // Primary Key
      [Word1]       VARCHAR(250)    NOT NULL,
      [Word2]       VARCHAR(250)    NOT NULL,
      [Relevancy]   DECIMAL         NOT NULL,
)

但是使用这种结构,如果有100,000个单词,在tbl_WordRelevancy表中将有100,000 * 100,000个单词。我觉得它不好。 (这个数据库可以在一天内增长到1M字) 是否可以使用关系数据库结构来维护这个东西?或者维持这种结构的其他方法是什么。 ?

2 个答案:

答案 0 :(得分:1)

你真正想要的是在单词之间称为多对多的关系。

CREATE TABLE words (
  word VARCHAR(250) PRIMARY KEY
);

CREATE TABLE word_relevancies (
  leftword  VARCHAR(250) REFERENCES words,
  rightword VARCHAR(250) REFERENCES words,
  relevance DECIMAL NOT NULL,
  PRIMARY KEY (leftword, rightword)
);

在您的原始表述中,您误认为桌子的关系。这是学习如何思考的常见步骤。

我强烈建议您阅读一本关于关系数据库设计的书,例如Joe Celko的 SQL for Smarties Thinking in Sets ,并熟悉正确的数据库设计。你会为自己省下很多痛苦。

答案 1 :(得分:1)

你很亲密。

CREATE TABLE tbl_Words
(
      [WordID]      BIGINT          NOT NULL   IDENTITY(1,1),  // This s Primary Key
      [Word]        VARCHAR(250)    NOT NULL,                  // This s Unique..
)

注释不会使WordID成为主键或Word唯一。

CREATE TABLE tbl_Words
(
      [WordID] BIGINT  IDENTITY(1,1) PRIMARY KEY,
      [Word]   VARCHAR(250) NOT NULL UNIQUE
);

但我认为你真的在寻找更多这方面的东西。

create table words (
   word varchar(250) primary key
);

create table word_relevance (
    word_a varchar(250) not null references words (word),
    word_b varchar(250) not null references words (word),
      primary key (word_a, word_b),
      constraint ordered_words check (word_a <= word_b),
    relevance integer not null check (relevance between 0 and 100)
);

CHECK约束要求在插入之前对单词进行排序;在存储“单词1,单词3”和“单词3,单词1”两种组合时似乎没有意义。由于你使用整数作为百分比,你可能最好使用整数而不是小数来表示相关性。

我认为你不可能每天加载一百万个独特单词。牛津英语词典的第二版有不到175,000字的完整定义。你的目标语言可能有所不同,但仍然存在。 。

要创建报告,请使用PIVOT非常限制性WHERE子句。没有dbms将转入175,000列。我怀疑没有人会想要阅读超过一页左右 - 最多30或40列。