脂肪酶, 我要像这样开发一个数据库,
在这里,我有一个单词列表。我需要保持数据库中每个其他单词的相关性。当添加一个新单词时,我需要能够添加一行和一列。
我对此的一个想法就是这样,
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字) 是否可以使用关系数据库结构来维护这个东西?或者维持这种结构的其他方法是什么。 ?
答案 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列。