数据库设计查询:合并表格还是保持分开?

4

我正在设计一个数据库驱动的网站。

我有两个类似的表,GPU供应商CPU供应商。两个表都有相同的列:id,vendor_name,vendor_url,vendor_bio

你会创建单独的表还是将它们合并,或许添加一个类型

我不想让我的经验不足影响到以后的设计。先思考,再行动!:)


很高兴看到你至少考虑了澄清问题。我遇到过许多“遗留”系统,其数据库模式似乎是即时创建的。 - YetAnotherUser
我想象当你在多年后修改数据库时,情况会变得非常复杂! - Lord Kinboat
我明白你的意思。三年后,添加一个表比向现有表添加一列更容易。再过三年,YAU会为什么有两个表而抓狂 :) - YetAnotherUser
2个回答

4
如果它们在问题域中真的是“供应商”,我会创建一个名为“VENDOR”的表,并添加“VENDOR_TYPE”列以及其他列。
Table Vendor{
    id, 
    vendor_type,
    vendor_name, 
    vendor_url, 
    vendor_bio    
}

如果它们是两种逻辑上不同的实体类型,我会倾向于创建两个独立的表。在您的情况下,似乎应该是“供应商(VENDOR)”,而不是“GPU供应商(GPUVendor)”和“CPU供应商(CPUVendor)”。

1
YAU概述了答案。在像你这样的大多数情况下,我将两个表合并为一个表,并使用类型列来指示每个条目属于哪种类型。
这取决于您如何使用数据。如果您的许多查询将GPU类型的行与CPU类型的行组合在一起,则单个表格将产生更好的结果。如果几乎所有查询都是关于GPU类型或仅关于CPU类型的,则两个表格设计将产生更好的结果。
最终,这归结为YAU所说的:它们是两个实体还是一个实体。
我要补充一点,无论哪种方式,您都可以构建一个或两个视图,使数据看起来不同。如果您创建一个单独的VENDORS表,则可以创建一个仅选择CPU类型的CPU_VENDORS视图和一个仅选择GPU类型的GPU_VENDORS视图。然后方便时可以访问这些视图。
如果您采用两个表格设计,则可以创建一个由GPU_VENDORS和CPU_VENDORS联合而成的单个VENDORS视图,并在需要时使用它。
除了性能影响外,视图将使您获得最佳效果。

我有一个相关的问题:假设我选择合并表格,并且有一个类型列来区分“cpu_vendor”和“gpu_vendor”。如果我有一个销售CPU和GPU的CPU供应商怎么办?我是否为同一供应商拥有两个条目(显然不是),还是在类型中有一个条目是“cpu/gpu”? - Lord Kinboat
LK,你可以通过询问供应商字段是否一起构成候选键来回答你的相关问题,或者你是否需要添加类型字段才能获得候选键。不幸的是,将每个表分配一个自动编号ID字段的普遍做法将数据的关系模型降低为具有间接寻址的图形模型。 - Walter Mitty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接