2016-01-20 1 views
1

, этот вопрос, возможно, был задан тысячу раз, но я не знал, как его сформулировать в google, поэтому я не получил никаких хороших ответов.Как хранить данные, которые по существу являются списком, привязанным к уникальному значению в SQL

Предположим, что у меня есть таблица «слов» в SQL, которая хранит некоторое слово в первом столбце каждой строки. Здесь я хочу сохранить все синонимы этого слова и связать их с этим словом в первом столбце. Например, если у меня есть слово «сердитый», я хочу связать слова «сумасшедший, горький, разъяренный, яростный, раздраженный» и т. Д. К этому слову, поэтому, если я хочу получить все синонимы с SQL-запросом, я могу легко Сделай так.

Как я понимаю, попытка хранения списков в ячейке - это не выход. Единственное, что я могу придумать, это сделать запись строки для «сердитых» для каждого и каждого из ее синонимов. Но если слово имеет много синонимов, или у меня много слов, похоже, что будет много записей (и много ненужных дубликатов каждого слова). Есть ли более эффективная практика для достижения моей цели, чем эта?

ответ

1

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

create table words (
    WordId int not null primary key auto_increment, 
    Word varchar(255) 
    . . . 
); 

create table synonyms (
    SynonymId int not null primary key auto_increment, 
    WordId int not null, 
    Synonym varchar(255), 
    . . . 
    constraint fk_wordid foreign key (WordId) references Words(WordId) 
); 

Если синонимы обязательно слова, то вы должны использовать идентификатор во второй таблице:

create table synonyms (
    SynonymId int not null primary key auto_increment, 
    WordId int not null, 
    SynonymWordId int not null, 
    . . . 
    constraint fk_wordid foreign key (WordId) references Words(WordId), 
    constraint fk_synonymwordid foreign key (SynonymWordId) references Words(WordId) 
); 
2

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

table word 
wordID int pk 
word varchar 
other fields 

table synonym 
wordID int FK to word 
synonymID int FK to word 
pk is both fields 

запрос синонимов разгневанных

select s.word 
from word w join synonym sy on w.wordID = sy.wordID 
join word s on sy.synonymID = s.wordID 
where w.word = 'angry' 
+0

Мы, вероятно, всегда будем не соглашаться на использование синтетических или составных первичных ключей. Оба метода имеют свои достоинства. Приветствия. –

+0

Когда у двух людей есть разница во мнениях, единственное, что вы можете быть уверены в том, что каждый из них способен сформировать его. –

0

А стол со словами:

CREATE TABLE words (
    id integer PRIMARY KEY, 
    word varchar(100) NOT NULL 
); 
INSERT INTO words VALUES (1,'angry'), (2,'mad'), (3,'bitter'), 
(4,'enraged'), (5,'furious'), (6,'irritated'), 
(7,'nice'), (8,'pleasant'), (9,'cute'); 

таблица синонимов групп

CREATE TABLE synonymgroups (
    id integer PRIMARY KEY, 
    description varchar(100) 
); 
INSERT INTO synonymgroups VALUES (1,'synonyms for "angry"'), 
(2,'synonyms for "nice"'); 

и таблицы с группой - слово картирование

CREATE TABLE synonyms (
    synonymgroupid integer NOT NULL REFERENCES synonymgroups, 
    wordid integer NOT NULL REFERENCES words, 
    PRIMARY KEY (synonymgroupid,wordid) 
); 
INSERT INTO synonyms(synonymgroupid,wordid) VALUES (1,1), (1,2), (1,3), 
(1,4), (1,5), (1,6), (2,7), (2,8), (2,9); 

Найти все синонимы для слова "бешеной":

SELECT s.wordid, w.word, s.synonymgroupid, sg.description 
FROM synonyms s 
    JOIN words w ON w.id=s.wordid 
    JOIN synonymgroups sg ON sg.id=s.synonymgroupid 
WHERE s.synonymgroupid IN (
    SELECT synonymgroupid 
    FROM synonyms 
    JOIN words ON words.id=synonyms.wordid 
    WHERE words.word='mad' 
); 

PS. Базы данных SQL, вероятно, не лучший инструмент для такого рода задач. Это просто пример.

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