我们有一个包含两列的表:
tblCategory
Id | Name
1 Brand
2 Band
3 Price
现在我们有另一个表定义类别
的范围或括号tblCategoryBrackets
Id | Value | Category_Id
1 5 3
2 10 3
3 20 3
4 Wilson 1
5 Babolat 1
6 Head 1
现在给定一个价格和一个品牌我们需要得到它们的括号。
例如:给定Price = 17
和Brand = Dunlop
,查询应返回Id = 2 and 5
的括号
由于Price = 17
位于价格括号10 and 20
和Brand = Dunlop
之间,因此位于Babolat and Head
之间。所以我们返回较低的类别括号id。
我们的实施问题是因为Value
中tblCategoryBrackets
的类型为Varchar
,所有比较都是基于字符串的,因此5
的处理大于10
}。
如何设计表格?
选项A - 我应该为不同的类别设置不同的表格。
我的意见 - 会导致桌面爆炸。但是会灵活,可以键入值。对于Price Decimal
,对于Brand Varchar
等。维护可能是一个问题,因为每当数据库中出现新类别时都需要更新。会导致停机。在代码中根据类别类型从适当的表中检索数据。
选项B - 就像我们现在的方式一样。
但是在代码(Java / C#)中形成查询,使得对于特定类别,基于类别值类型完成特定CAST
,然后进行比较。
无法弄清楚那个类的设计。
非常感谢专家的回复。
答案 0 :(得分:3)
我会正确地规范化数据库。这是滥用数据库设计的最常见方法之一。
如果我们要将此转换为第3范式,Brand会有自己的表,Band(?)可能会有自己的表,价格会在包含其他商品数据的表中(或者如果是那个表)不存在,然后创建它。)
我不知道这会导致"桌面爆炸"除非你非常简化你的例子。
ItemTable
Id | Itemname | ItemBrand | ItemBand
1 | Foobar | 2 | 3
CategoryTable
Id | CategoryName
1 | Foo
2 | Bar
3 | Baz
等