空值
这也意味着项目将有 5 个 id,包括它自己的。这一切都会导致空值(显然是一个很大的不,我可以理解),因为如果地点和价格是可选的并且不用于项目表的一个条目,我将在那里有一个空值
就我个人而言,我认为这是一种NULL
价值完美的情况,我当然不会怀疑将其纳入我的数据库设计中。
我看到其他人在没有NULL
值的情况下实现相同目标的一种方法是在可选表(在您的示例中为地点和价格)中创建一条记录,其 ID 为 0,表示没有相关记录 - 但这只会增加 10 倍的工作量让应用程序的开发人员过滤掉这些记录 - 进行连接要容易得多,如果您没有返回任何记录,则可选表中没有相关记录。
只要记住执行 aLEFT
或RIGHT OUTER
join 如果您想返回Item
s 而不管它们是否有 aPlace
或Price
关联(您将NULL
在可选表列中为Item
没有关联记录的 s 获取值)和INNER
join 如果您只想要具有关联的可选记录Item
的 s 。
复合键
复合键是由多个列组成的表中的键。如果您的每个, 和Person
allItem
都有一个 ID(即使它只是一个自动递增的数字),您将不需要复合键 - 每个表中只需要一个主键列,每个表中都有一个外键列相关表 - 例如, , , . 您声明它有自己的 ID,因此您不需要复合键 - 只需列上的主键。Place
Price
Item
item_id
person_id
place_id
price_id
Item
item_id