1

我对一个问题有点困惑,想知道我是否遗漏了一些简单的东西。

我有三张桌子:

create table A (id serial primary key, name char(50));
create table B (id serial primary key, name char(50));
create table c (A int references A(id), B int references b(id));

并且我确保不重复使用 A & B 关系:

create index unique_a_b_in_c on c (A,B);

然后我使用hibernate将这些文件逆向工程为Java对象。

到目前为止一切都很好,但现在我想做的是确保 A 的每个实例都有 B 记录的唯一组合。(例如,如果我在 B - B1 和 B2 中有 2 条记录,那么我的 A 记录只能有四个可能的值,即:无记录、B1 记录、B2 记录或 B1 和 B2 记录。 )

到目前为止,我最好的尝试是在 A 中创建一个唯一的哈希码,该哈希码基于属于该记录的类型 B 记录,然后覆盖 equals 函数以检查 A 的 B 记录集合的内容。如果对象相等,我会更新A记录,但如果A记录是新的,我可以保存它。

显然,这对于 equals 来说是一个繁重的过程,并且随着 B 的大小变大,检查匹配项时的处理时间也越来越长。

我目前的想法是放弃任何提供这种唯一性的尝试,并允许重复,尽管它们在我的问题的上下文中没有意义,因为 A 实际上是由组成它的 B 记录的组合定义的。

有没有人对如何解决这个问题有任何想法?

非常感谢 !

4

1 回答 1

1

当您定义了“B”组时,构建一个 SELECT 语句来检查它是否已经定义为“A”应该是一件简单的事情。

SELECT A, count(*) as rows from c where B IN ( 'B1', 'B2' ... ) group by A

如果 count(*) = IN 子句中的元素数,那么您找到了与 B 匹配的 A。该语句应该运行相对较快,尤其是在 B 被索引的情况下。

然而,它会随着 c 的增长而减慢。你可以尝试添加

HAVING count(*) = 2 (or whatever your count of the number of rows of B is)

但是由于 HAVING 通常是在初始查询之后由优化器完成的,它可能不会加快速度,但如果匹配,它会给你一行,如果不匹配,它会给你一行。

于 2012-07-23T23:45:44.173 回答