1

我的数据模型中有一个对象,如下所示:

// A word in the English language.
public class Word {
    private Long id;                 // Ex: 35
    private String text;             // Ex: "catlike"
    private Integer length;          // Ex: 7
    private String definition;       // Ex: "resembling a cat; stealthy"
    private List<Word> synonyms;     // Ex: "quick", "nimble"
    private List<Word> antonyms;     // Ex: "sluggish", "slow"

    // Getters, setters, ctors, etc. omitted for brevity; this is a simple POJO/bean
}

如您所见,它包含 2 个“递归”其他词(同义词和反义词)列表。AWord与它的同义词和反义词都具有多对多的关系。例如:“ cat-like ”的同义词可能是“ quick ”,但“ quick ”也是“ fast ”的同义词,等等。

我的计划Word是使用 3 个不同的表对数据库中的 s进行建模:1 个主words表和 2 个人行横道/连接表:

  • words
  • synonyms(人行横道)
  • antonyms(人行横道)

表格及其字段:

[words]
    id            PRIMARY KEY AUTO INCREMENT
    text          VARCHAR
    length        INTEGER
    definition    VARCHAR

[synonyms]
    id            PRIMARY KEY AUTO INCREMENT
    word_1_id     FOREIGN KEY (words)
    word_2_id     FOREIGN KEY (words)

[antonyms]
    id            PRIMARY KEY AUTO INCREMENT
    word_1_id     FOREIGN KEY (words)
    word_2_id     FOREIGN KEY (words)

所以我的想法是,如果我想查询描述中包含“ metal ”的任何单词,或者其中包含“ metal ”的任何同义词,我的查询可能如下所示:

SELECT
    *
FROM
    words w
INNER JOIN
    synonyms s
ON
    w.id = s.word_1_id
WHERE
    w.definition LIKE '%metal%'
    OR
    ??? (synonym of w).definition LIKE '%metal%'

我是否正确地模拟了这种递归关系?!?我觉得我要么死心塌地,要么完全脱离基地,忽视了一些明显的东西。提前致谢!

4

2 回答 2

0
select * from (
SELECT
    *
FROM
    words w
WHERE
    w.definition LIKE '%metal%'
) UNION (
SELECT
    w1.*
FROM
    words w1,
    words w2,
    synonyms s
WHERE
    w1.id = s.word_1_id and
    w2.id = s.word_2_id and
    w2.definition LIKE '%metal%'
)

)

于 2013-10-12T11:34:02.227 回答
0

我想要正确模式我的 Java POJO 的表(每个 Word 可以有 0+ Word 同义词和反义词)

您的数据库模型很好,它应该能够在 Java 端支持您的模型。请注意,synonymsandantonyms是定向的,因此您应该为两个方向添加记录,或者在连接条件中将单个记录视为双向。

我可以查询定义中包含“金属”的任何单词,以及其任何同义词的描述中也包含“金属”。

您的查询不需要顶部连接,可以使用EXISTS运算符完成,如下所示:

SELECT
    *
FROM words w
WHERE
    w.definition LIKE '%metal%'
    OR
    EXISTS (
        SELECT *
        FROM words ww
        JOIN synonyms ss ON ww.id = ss.word_1_id
        WHERE ww.definition LIKE '%metal%'
    )

请注意,此查询将为您提供符合条件的单词,而不是其同义词/反义词。这些应单独查询以完成 Java 表示所需的数据。为了完成查询的这一部分,您可能需要构建一个递归查询,通过一组多对多表为您提供与给定单词相关的所有单词。以这个答案为例。

要对称地处理多对多表,请更改

ww.id = ss.word_1_id

条件:

ww.id = ss.word_1_id OR ww.id = ss.word_2_id

这将模拟“单词 W 具有同义词 Q,或者是 Q 的同义词”的含义。

于 2013-10-12T12:15:02.433 回答