2011-09-14 2 views
1

госзакупок Я разработать базу данных, как это,реляционной базы данных система с динамическими столбцами с динамическими рядами

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

, но с этой структурой, если есть 100000 слов, в tbl_WordRelevancy таблице будет 100000 * 100000 слов. Это нехорошо, я думаю. (Эта база данных может вырасти до 1 М слов за один день) Возможно ли поддерживать эту вещь с использованием структуры реляционной базы данных? или другие способы сохранения этой структуры. ?

+0

Где вы получаете миллион уникальных слов в день? Какой язык? –

ответ

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

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

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

я настоятельно рекомендую вам получить книгу на проектирования реляционных баз данных, таких как SQL Джо Селко для Smarties или мышления в наборах и ознакомиться с правильным проектирования баз данных. Вы сбережете себе много боли.

+0

Разве ваш стол «word_relevancies» по существу не отличается от «tbl_WordRelevancy» OP? Я дам ему, что у него была некорректная реализация отношений M: N (между прочим), но мне кажется, что он все равно находится на пути к отношениям M: N с этой таблицей. –

Смежные вопросы