具有复合键的一对多注释映射

Posted

技术标签:

【中文标题】具有复合键的一对多注释映射【英文标题】:one to many annotation mapping with composite key 【发布时间】:2012-08-01 10:32:42 【问题描述】:

我有两张表,如下所述。关键是我的问题有“n”个选择。我设计在第二个表上使用复合键,而不是多列一列作为主键。使用这种方法,我有两个问题。

    这是表格设计的好方法吗?我的意思是 TABLE QUESTIONCHOICE 具有复合键而不是主键。

    如何在 Hibernate 中使用注释在 QUESTIONBANK 和 QUESTIONCHOICE 表之间进行一对多映射?

任何观点和建议都会有很大帮助。

谢谢,

-维杰·塞尔瓦拉杰

CREATE TABLE QUESTIONBANK(
    QUESTIONID INT NOT NULL AUTO_INCREMENT(10001, 1),
    QUESTION VARCHAR(200) NOT NULL,
    TOPIC VARCHAR(20) NOT NULL,
    SUBTOPIC VARCHAR(20) NOT NULL,
    COMPLEXITY SMALLINT  NOT NULL DEFAULT 1,
    QUESTIONTYPE SMALLINT  NOT NULL,
    VERSION INT NOT NULL DEFAULT 0,
    CONSTRAINT QUESTIONBANK_PK PRIMARY KEY (QUESTIONID)
);

CREATE TABLE QUESTIONCHOICE(
   QID INT NOT NULL,
   CHOICE VARCHAR(100) NOT NULL,
   CORRECT_CHOICE BOOLEAN, 
   VERSION INT NOT NULL DEFAULT 0,
   CONSTRAINT QUESTIONCHOICE_PK PRIMARY KEY (QID, Choice),
   CONSTRAINT QUESTIONCHOICE_FK FOREIGN KEY (QID) REFERENCES QUESTIONBANK (QUESTIONID)
);

【问题讨论】:

【参考方案1】:

让我回答你问题的前半部分......

    这是表格设计的好方法吗?我的意思是 TABLE QUESTIONCHOICE 具有复合键而不是主键。

这不是一个非此即彼的命题。您有一个键,它恰好是复合键和主键。

您的设计是否有效取决于CHOICE 的相同值是否应该能够存在于多个QUESTIONCHOICE 行中(连接到不同的问题):

如果是,那么您的设计是正确的。 如果否,则不正确,您应该单独将 CHOICE 设为键。

是否还要添加代理键是一个平衡的问题,这里有some criteria 来帮助您做出决定。

【讨论】:

感谢您的回复回答了我的第一个问题。实现的第二部分很棘手:)

以上是关于具有复合键的一对多注释映射的主要内容,如果未能解决你的问题,请参考以下文章

微风:尽管定义了 invForeignKeyNames,但仍然没有填充复合外键的单向一对多导航

休眠一对多映射注释问题

一对多映射和附加条件列不是外键的一部分

如何在 Fluent NHibernate 中将一对一关系映射为复合键的一部分

思考具有两个外键的一对多或多对多关系的正确方法是啥?

具有一对多关系的表的规范化