table如何设计主键多值属性?

How to design table with primary key and multivalued attribute?

我对数据库设计很感兴趣,现在正在阅读相应的文献。 通过这本书,我遇到了一个奇怪的例子,让我感到不确定。 有关系

在这个 table 中,我们有一个复合主键(StudentID,Activity)。但是ActivityFee部分依赖于table的key(Activity -> ActivityFee),所以作者建议将这个关系分成另外两个关系:

现在如果我们看一下 STUDENT_ACTIVITY,Activity 变成外键并且关系仍然有一个复合主键。

我们得到了table,其中所有列都定义了一个复合主键,可以吗?

如果不是,这种情况怎么办? (可能定义代理键?)

为了消除可能的数据异常,处理多值属性(Activity 在我们的例子中)的好方法是什么?

如果符合您的业务需求,仅由复合键组成的 table 完全可以。

Activity 不是多值属性。每个元组的 activity 有一个值。

复合候选键没有问题。 (如果您的参考文献没有谈到候选键,即如果它在任何其他情况下谈论主键而不是恰好只有一个候选键,请获取新参考。)

您的文字将告诉您什么是好设计,什么是坏设计。没有必要担心您注意到的每个 属性 可能是 "bad" 的关系。当前正在寻址的 "good" 类型是由 "normalization".

给出的

"Activity" 不是 "multivalued attribute"。 "multivalued" 属性是一个非关系概念。该术语经常但不正确地用于表示非关系 "table" 中的 "attribute" 以某种方式(从未解释过)每个 "row" 有多个条目,或者对于列在具有多个相似部分(集合、列表、包、table 等)的关系 table 中,不知何故(从未解释过)不适用于字符串和数字,或者对于关系 table 中的列,该列具有多个不同部分(记录、元组等)的值,但不知何故(从未解释过)不适用于日期。 (有时它甚至被误用为一堆具有相似名称和值的属性,应该用单个属性替换,每个原始名称一行。)(这些只是不需要的设计的情况。)"Multivalued" 被用作类似 misused/abused 术语 "atomic".

的反义词

相同(值或)值的子行在一列中出现不止一次,或者 table 本身既不好也不坏。同样,您的参考会告诉您什么是好的设计。