数据库设计 - 列具有存储为varchar的不同类型的值

时间:2014-07-25 18:08:56

标签: java c# mysql sql-server design-patterns

我们有一个包含两列的表:

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 = 17Brand = Dunlop,查询应返回Id = 2 and 5的括号 由于Price = 17位于价格括号10 and 20Brand = Dunlop之间,因此位于Babolat and Head之间。所以我们返回较低的类别括号id。

我们的实施问题是因为ValuetblCategoryBrackets的类型为Varchar,所有比较都是基于字符串的,因此5的处理大于10 }。

如何设计表格?

选项A - 我应该为不同的类别设置不同的表格。

我的意见 - 会导致桌面爆炸。但是会灵活,可以键入值。对于Price Decimal,对于Brand Varchar等。维护可能是一个问题,因为每当数据库中出现新类别时都需要更新。会导致停机。在代码中根据类别类型从适当的表中检索数据。

选项B - 就像我们现在的方式一样。

但是在代码(Java / C#)中形成查询,使得对于特定类别,基于类别值类型完成特定CAST,然后进行比较。 无法弄清楚那个类的设计。

非常感谢专家的回复。

1 个答案:

答案 0 :(得分:3)

我会正确地规范化数据库。这是滥用数据库设计的最常见方法之一。

如果我们要将此转换为第3范式,Brand会有自己的表,Band(?)可能会有自己的表,价格会在包含其他商品数据的表中(或者如果是那个表)不存在,然后创建它。)

我不知道这会导致"桌面爆炸"除非你非常简化你的例子。

ItemTable
Id | Itemname | ItemBrand | ItemBand
1  | Foobar   | 2         | 3     

CategoryTable
Id | CategoryName
1  | Foo
2  | Bar
3  | Baz