Sql外键

Sql外键,sql,sql-server,sql-server-2005,sql-server-2008,Sql,Sql Server,Sql Server 2005,Sql Server 2008,我试图在数据库中存储40个txt文档。首先,我创建了一个包含文件ID和名称的表。其次,我创建了一个表(WORDS),它将存储所有40个txt文件的内容(逐字)。我需要在表(WORDS)中创建一个外键,将每个单词引用到找到它的原始文件中 显然,如果我手动操作,这将很困难,因为可能有一百万个单词 我的第一个问题是:有没有什么方法可以让我自动实现这种方法?使用sql查询 我的第二个问题:sql server如何区分哪个单词最初位于哪个文件中?sql server(以及许多其他数据库)以本机方式支持全文

我试图在数据库中存储40个txt文档。首先,我创建了一个包含文件ID和名称的表。其次,我创建了一个表
(WORDS)
,它将存储所有40个txt文件的内容(逐字)。我需要在表
(WORDS)
中创建一个外键,将每个单词引用到找到它的原始文件中

显然,如果我手动操作,这将很困难,因为可能有一百万个单词

我的第一个问题是:有没有什么方法可以让我自动实现这种方法?使用sql查询

我的第二个问题:sql server如何区分哪个单词最初位于哪个文件中?

sql server(以及许多其他数据库)以本机方式支持全文搜索,这通常是一个比您建议的更好的解决方案

也就是说,如果您确实需要您的方法,您可以执行以下操作:

CREATE table fileTable 
(
    ID int identity,
    nameOfFile nvarchar(200),
    PRIMARY KEY (ID),
    UNIQUE(nameOfFile)
)
GO

CREATE table words
(
    ID int identity,
    word nvarchar(200),
    PRIMARY KEY(ID),
    UNIQUE(word)
)
GO

CREATE table file_words
(
    fileId int,
    wordId int,
    FOREIGN KEY (fileId) REFERENCES fileTable(ID),
    FOREIGN KEY (wordId) REFERENCES words(ID),
    UNIQUE(fileId,wordId)
)
GO

declare @fileContents nvarchar(max)
SET @fileContents = 'Hello world.  I am a silly word splitter.'
declare @fileName nvarchar(200)
SET @fileName = 'HelloSplitter.txt'


declare @whiteSpaceOrPunctuation table
(
    charVal nchar(1)
)

insert @whiteSpaceOrPunctuation
SELECT ' ' UNION ALL SELECT ',' UNION ALL SELECT ';' UNION ALL SELECT ':'
UNION ALL SELECT '-' UNION ALL SELECT '_'  UNION ALL SELECT '['  UNION ALL SELECT ']' 
UNION ALL SELECT '!' UNION ALL SELECT '.' UNION ALL SELECT '?' UNION ALL SELECT '%' 
UNION ALL SELECT '$' UNION ALL SELECT '#'
--etc...

declare @position int
declare @word nvarchar(max)
declare @fileLength int
declare @fileId int
declare @wordId int
SET @position = 1
SET @fileLength = LEN(@fileContents)
SET @word = ''
declare @currentChar nchar

INSERT fileTable (nameOfFile) VALUES (@fileName)

SELECT @fileId = SCOPE_IDENTITY()



while (@position <= @fileLength + 1)
BEGIN
    --print @position
    --print @fileLength

    SELECT @currentChar = SUBSTRING(@fileContents, @position, 1)

    --print @currentChar

    IF (EXISTS(SELECT 1 FROM @whiteSpaceOrPunctuation WHERE charVal = @currentChar) OR @position = @fileLength + 1)
    BEGIN
        --print 'word: ' + @word
        IF(@word <> '')
        BEGIN
            --print @word

            SELECT @wordId = ID FROM words where word=@word

            IF (@wordId IS NULL)
            BEGIN
                INSERT words (word) VALUES (@word)
                SELECT @wordId = SCOPE_IDENTITY()
            END

            IF (NOT EXISTS(SELECT 1 FROM file_words WHERE wordId = @wordId AND fileId=@fileId))
            BEGIN
                INSERT file_words (fileId, wordId) VALUES (@fileId, @wordId)
            END
            SET @word = ''
            SET @wordId = null
        END
    END
    ELSE BEGIN
        SELECT @word = @word + @currentChar
    END

    SELECT @position = @position + 1
END

--select * from fileTable
--select * from words
--select * from file_words

--drop table file_words
--drop table words
--drop table fileTable
createtablefiletable
(
ID int标识,
文件名nvarchar(200),
主键(ID),
唯一(文件名)
)
去
创建表格单词
(
ID int标识,
单词nvarchar(200),
主键(ID),
唯一(word)
)
去
创建表格文件\u单词
(
fileId int,
wordId int,
外键(fileId)引用fileTable(ID),
外键(wordId)引用单词(ID),
唯一(fileId、wordId)
)
去
声明@fileContents nvarchar(最大值)
设置@fileContents='你好,世界。我是个愚蠢的分词人。”
声明@fileName-nvarchar(200)
SET@fileName='HelloSplitter.txt'
声明@whitespaceorpuncuation表
(
夏瓦尔·恩查尔(1)
)
插入@whitespaceorpunchuation
选择“联合所有选择”、“联合所有选择”联合所有选择“:”
联合所有选择'-'联合所有选择'.'联合所有选择'['联合所有选择']'
联合所有选择'!'联合所有选择“.”联合所有选择“?”联合所有选择“%”
联合所有选择“$”联合所有选择“#”
--等等。。。
声明@positionint
声明@word nvarchar(最大值)
声明@fileLength int
声明@fileId int
声明@wordId int
设置@position=1
设置@fileLength=LEN(@fileContents)
设置@word=''
声明@currentChar
插入fileTable(nameOfFile)值(@fileName)
选择@fileId=SCOPE\u IDENTITY()

while(@position-Well,您在数据库中插入文本文件的任何东西都会插入元数据(找到的位置等)?为什么您需要将每个单词存储在自己的行中?单词本身是否表示“实体”到您的系统?@derobert插入单词不是问题,我使用的是大容量。将每个单词分配到其文件名的外键是问题。@HumamShbib:然后使用类似全文搜索的方法。不要将每个单词存储为一行。这将是一个巨大的空间浪费。忘记使用数据库:这是一项针对的工作,这是一个purpose的构建正是为了做你想做的事情。不要再发明轮子了!