Database design 数据库设计中的几个问题

Database design 数据库设计中的几个问题,database-design,Database Design,如果我有一个customer表,它将存储姓名、地址、电子邮件地址、电话号码,甚至可能存储一些有关客户的详细信息,如年龄、偏好等 如果我把它划分成更小的表,我会做一件好事吗?例如,customer_contact与contact字段,并在原始customer表中只保留姓名、出生日期等 此外,对于查找表,它们只是将不同表中的字段组合到一个大表中,对吗 此外,在我自己的系统中,我有一个表示产品的表,但它只有一个ID。该表的唯一字段是一个适用于许多产品的字段/属性(如road legal),这是另一个表

如果我有一个customer表,它将存储姓名、地址、电子邮件地址、电话号码,甚至可能存储一些有关客户的详细信息,如年龄、偏好等

如果我把它划分成更小的表,我会做一件好事吗?例如,customer_contact与contact字段,并在原始customer表中只保留姓名、出生日期等

此外,对于查找表,它们只是将不同表中的字段组合到一个大表中,对吗

此外,在我自己的系统中,我有一个表示产品的表,但它只有一个ID。该表的唯一字段是一个适用于许多产品的字段/属性(如road legal),这是另一个表的字段,因此两个表之间存在约束(关系)。我假设一个查找表会将这两个表合并在一起,对吗

谢谢,视情况而定

当每个客户可能有多行(未知)联系人时,可以使用customer_contacts表。另一方面,如果您确定每个客户有3个联系人详细信息,则可以将其存储在与客户相同的表中。

视情况而定


当每个客户可能有多行(未知)联系人时,可以使用customer_contacts表。另一方面,如果您确定每个客户有3个联系人详细信息,则可以将其存储在与客户相同的表中。

在大多数情况下,通常最好进行分解。当然,在你列出的所有情况下

尝试将您的数据库设计想象为Java等语言中的OOP程序,其中链接了复杂对象。任何可以“链接”到实体的对象,尤其是可以链接到多个实体的对象,都可能是候选对象,因此也可能是表

只向主要客户表提供有关个人的核心信息,这些信息是按照您的建议识别个人所必需的


然后,所有其他元数据和辅助数据都可以绑定到它。例如,地址、电话号码或电子邮件都是很好的对象,候选对象应该拥有自己的表,特别是因为它们可能具有其他属性。然后,另一个表可以将地址与客户关联起来(例如,如果您的系统有一个完整的家庭,该怎么办)。

在大多数情况下,通常最好进行分解。当然,在你列出的所有情况下

尝试将您的数据库设计想象为Java等语言中的OOP程序,其中链接了复杂对象。任何可以“链接”到实体的对象,尤其是可以链接到多个实体的对象,都可能是候选对象,因此也可能是表

只向主要客户表提供有关个人的核心信息,这些信息是按照您的建议识别个人所必需的


然后,所有其他元数据和辅助数据都可以绑定到它。例如,地址、电话号码或电子邮件都是很好的对象,候选对象应该拥有自己的表,特别是因为它们可能具有其他属性。然后,另一个表可以将地址与客户关联起来(例如,如果整个家庭都在使用您的系统,该怎么办)。

一般来说,只有在列数量巨大的情况下(在这种情况下,可能需要重新设计),才会(垂直)对表进行分区,或者,如果您对不同的数据(SSN或与正常数据分离的薪资数据)有不同的安全要求


当你说“查找表”时,我想你实际上指的是“外键”。如果您有一个保存产品可用性的表,那么每一行都会有一个ProductID,该ID指向所有剩余的产品信息。

一般来说,如果您有大量的列(在这种情况下,可能需要重新设计),您只会(垂直)划分这样的表,或者,如果您对不同的数据(SSN或与正常数据分离的薪资数据)有不同的安全要求


当你说“查找表”时,我想你实际上指的是“外键”。如果您有一个保存产品可用性的表,那么每一行都会有一个ProductID,该ID指向所有剩余的产品信息。

术语查找表通常被过度使用。如果从标准编程的角度考虑,查找表相当于使用常量来引用幻数或常量对象

因此,您使用另一个实体的唯一标识符,该实体通常是原子的,因为它不包含其他对象(例如,状态、地址、产品详细信息等)。在core表中,您将使用ID而不是实际的详细信息


如果一个表指的是一个中心实体,最好从关系的角度来考虑,而不是从查找表的角度来考虑。

通常,术语查找表被过度使用。如果从标准编程的角度考虑,查找表相当于使用常量来引用幻数或常量对象

因此,您使用另一个实体的唯一标识符,该实体通常是原子的,因为它不包含其他对象(例如,状态、地址、产品详细信息等)。在core表中,您将使用ID而不是实际的详细信息


如果一个表引用了一个中心实体,那么最好从关系的角度来考虑,而不是从查找表的角度来考虑。

我认为数据库设计就是平衡和判断。如果你看不到数据库变得越来越大,那么就对它进行规范化。如果您可以看到它变得相当大,那么IMHO将停止规范化,除非它是必要的,即不在任何地方使用映射表,因为不管别人怎么说,扁平化数据库运行得更快

我会将地址存储在同一个表中,除非您认为客户可能需要地址历史记录或单独的账单和发货地址。我永远不会泄露联系方式和出生