Система реляционных баз данных с динамическими столбцами с динамическими строками

Чел, я должен разработать базу данных, как это,

Здесь у меня есть список слов. Мне нужно сохранить релевантность для каждого другого слова в базе данных. когда новое слово добавлено, мне нужно иметь возможность добавить строку, а также столбец.

Одна из моих идей для этого такова,

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 слов. Это не хорошо, я думаю. (Эта база данных может вырасти до 1 млн слов за один день) Можно ли сохранить эту вещь, используя структуру реляционной базы данных? или каковы другие способы поддержания этой структуры.?

2 ответа

Решение

Ты рядом.

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 столбцов.

То, что вы на самом деле хотите, называется отношением " многие ко многим" между словами.

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

В своей первоначальной формулировке вы ошибочно приняли отношения за стол. Это общий шаг в обучении мыслить в наборах.

Я настоятельно рекомендую вам приобрести книгу по проектированию реляционных баз данных, такую ​​как " SQL for Smarties" от "Joe Celko" или " Мышление в наборах", и ознакомиться с правильным дизайном баз данных. Вы избавите себя от большой боли.

Другие вопросы по тегам