Система реляционных баз данных с динамическими столбцами с динамическими строками
Чел, я должен разработать базу данных, как это,
Здесь у меня есть список слов. Мне нужно сохранить релевантность для каждого другого слова в базе данных. когда новое слово добавлено, мне нужно иметь возможность добавить строку, а также столбец.
Одна из моих идей для этого такова,
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" или " Мышление в наборах", и ознакомиться с правильным дизайном баз данных. Вы избавите себя от большой боли.