我对制作一个好的关系数据库有点困惑。我正在使用 phpmyAdmin 创建数据库。我有以下四个表。不要担心地点和价格是可选的,它们只是可选的。
- 人(必填)
- 项目(必填)
- 地点(可选)
- 价格(可选)
Item是主表。它将始终与人联系。 * 我知道你确实在 mysql 中加入了表。 如果我想将表链接在一起,我可以使用复合键(使用每个表中的 ID),但这是链接表的最正确方法吗?这也意味着项目将有 5 个 id,包括它自己的。这一切都会导致空值(显然是一个很大的不,我可以理解)因为如果地点和价格是可选的并且不用于项目表的一个条目,我将在那里有一个空值。请帮忙!
提前致谢。我希望这是有道理的。
最佳答案
NULL 值
It also means item will have 5 ids including its own. This all cause null values (apparently a big no no, which I can understand) because if place and price are optional and are not used on one entry to the items table I will have a null value there
我个人认为这是 NULL
值完美的一种情况,我当然不会怀疑将其放入我的数据库设计中。
我看到其他人在没有 NULL
值的情况下实现同样的事情的一种方法是在可选表(示例中的位置和价格)中创建一个 ID 为 0 的记录,表示没有相关记录 - 但这只会让应用程序开发人员过滤掉这些记录的工作量增加 10 倍 - 进行连接要容易得多,如果您没有取回任何记录,则可选表中没有相关记录.
如果您想返回 Item
,无论它们是否有 ,请记住执行
或 LEFT
或 RIGHT OUTER
连接PlacePrice
关联(对于没有关联的 Item
,您将在可选表列中获得 NULL
值记录)和一个INNER
连接,如果你只想要确实的Item
有一个关联的可选记录。
复合键
复合键是由多列组成的表中的键。如果您的每个 Person
、Item
、Place
和 Price
都有一个 ID(即使它只是一个汽车-incrementing number)你不需要复合键 - 只需要每个表中的主键列,以及每个相关表的 Item
表中的外键列 - 例如item_id
,person_id
,place_id
,price_id
。您声明 Item
有自己的 ID,因此您不需要复合键 - 只需要 item_id
列上的主键。
关于使用 phpmyAdmin 的数据库关系(复合键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574228/