这主要是设计/性能问题。 目前,我在一个简单的项目中工作,并且有几乎相同的表,例如:
Table shirts
String Size
String Color
Table pants
String Size
String Color
在我的程序中,因为它执行非常基本的任务,所以程序性能不是一个优先事项,但是我遇到了这个问题,在SQL中,将这个表组合起来并使用新列让category带有一些centinel值会更有效吗?用于检查它是衬衫还是裤子,例如:
Table clothing
String Size
String Color
String type
,还是将其保留在两个表中,分别向两个表发出请求?
如果这取决于数据库类型,那么我正在使用sqlite3,以防答案仅适用于sqlite3。
答案 0 :(得分:0)
与所有数据库一样,SQLite将基础数据存储在“数据页”上。这些页面包含一定数量的记录。页面上的“空”记录占用空间。
如果您的数据分散在一堆表中,则可能会有更多的部分填充的数据页。结果是更大的数据库可以存储相同的记录。反过来,这可能会导致查询变慢。
这是您不想在多个表中存储相同数据的原因之一。还有其他原因-添加索引非常棘手,对所有对象运行查询很麻烦,维护表的工作量更大。
但是,在您的示例中,T恤和裤子并不完全相同。如果您的应用程序将这两种衣服都视为衣服,并且具有正好两个属性(颜色和尺寸),那么这很好。您可以使用品牌,时装年,主要材料以及服装可能具有的其他属性来扩展它。
但是,如果您需要开始添加特定的属性,那么您将面临一个难题。例如,裤子尺寸通常以腰围和长度来衡量。 T恤尺寸为S-M-L。您可能将它们编码为字符串,这可能对您有用。
由于您目前已经考虑过数据模型并且具有兼容的维度,因此我倾向于采用第二种方法。如果以后需要添加定制功能,则仍然有多种选择:
pants
表,该表使用与clothing
表相同的主键,并在其中添加其他功能。clothingAttributes
表,并将EAV数据模型用于其他属性。