是否使用复合主键?

时间:2016-09-10 05:37:16

标签: sql

enter image description here

ENTITY _COMMENT表中,为什么我们选择Entity_IDCOMMENT_NO的复合主键,而不是仅仅将COMMENT_NO作为主键。

4 个答案:

答案 0 :(得分:1)

你是对的,数据库设计中常见的做法是使用人工主键,例如" serial"所有行都是唯一的列。

但是,您案例中的entity_id是与实体具有识别关系的列的一个很好的示例。标识关系应用于列,该列是您在表中标识行的方式的一部分。因此,它是该表的主键的一部分。

答案 1 :(得分:1)

在复合键中,我们确保这两个键的组合永远不会重复。换句话说,组合将唯一地标识特定行。

我认为在您的场景中,可能有机会针对单个实体ID多次输入commentno。为了避免这种情况并确保业务完整性,将组合设置为主键。

答案 2 :(得分:0)

每个实体都有一组注释,由Comment_no(1,2,3等)标识。因此,不同的实体将具有相等的Comment_no,并且此属性无法区分所有其他实体中的Entity comment。相反,(Entity_id, Comment_no) 对可以识别所有其他Entity comment中的每个// use struct Analysis* instead of void* // void storeDataHere(struct Analysis* res) { int i; // initialize a1; struct Analysis a1; a1.a = 1; // memset(a1.b, 0, 10*sizeof(int)); no need to memset cause you set later for (i = 0; i < 10; i++) { a1.b[i] = 1; } // store a1 into ana[0], ana[1]; *res = a1; // assign value of pointer res to a1 } // pass array struct to function void saveData(struct Analysis data[]) { struct Analysis *data_array = data; // pass two struct elements to storeDataHere; storeDataHere(&data_array[0]); storeDataHere(&data_array[1]); // pass pointer of each element to StoreDataHere } ,并且可以用作主键。

答案 3 :(得分:0)

让我清楚地解释一下。您将Entity_ID和COMMENT_NO都作为主键,因为两者的组合往往是唯一的。在ENTITY_COMMENT表中考虑您已经有一个值 ENTITY = 10 COMMENT_NO = 20 。我会给你一些例子,

If you try to insert a value as,

Entity_ID    COMMENT_NO
10           5          - Data will be inserted because COMMENT is not 20         
6            20         -  Data will be inserted because Entity_id is not 10           
10           20         -  Here data will not be inserted because the combination of Entity_ID and COMMENT_NO is same.

希望你的怀疑是明确的。如果不让我知道会澄清你。