【问题标题】:Database Design - Column has values of different types stored as varchar数据库设计 - 列具有存储为 varchar 的不同类型的值
【发布时间】:2014-07-25 18:08:55
【问题描述】:

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

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 20 之间,而Brand = Dunlop 位于Babolat and Head 之间。所以我们返回较低的类别括号id。

我们实现的问题是因为tblCategoryBrackets 中的ValueVarchar 类型,所有比较都是基于字符串的,所以5 被视为大于10

表格应该如何设计?

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

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

选项 B - 按照我们现在的方式进行。

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

希望专家回复。

【问题讨论】:

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


    【解决方案1】:

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

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

    我不明白这会如何导致“表格爆炸”,除非您大大简化了示例。

    ItemTable
    Id | Itemname | ItemBrand | ItemBand
    1  | Foobar   | 2         | 3     
    
    CategoryTable
    Id | CategoryName
    1  | Foo
    2  | Bar
    3  | Baz
    

    等等

    【讨论】:

    • 感谢您的回复。是的,这个例子被简化了很多。但是您会在这里考虑维护问题吗?如果新类别出现在新表中,则需要创建。而在另一种情况下,它可以在代码本身中处理。你的意见?再次感谢。 BTW 什么是 ItemTable?
    • 是的,这通常(总是?)这背后的合理化。 “如果事情发生变化,我们将不得不修改架构”。事实是,这种数据库反模式会导致它自己的维护(和其他)问题,所以这并不能解决任何问题。问问自己(或其他人)您实际上需要多久更改一次架构以添加新表,以及添加新表是否真的是一个大问题。此外,添加新类别(本质上是一列)不需要新表,一个简单的更改表就足够了。如果可以的话,去第三范式,你不会后悔的。
    • 哦!谢谢,在 CategoryTable 中添加一行会添加一个类别,但随后需要添加其括号,因为这需要为此创建不同的 CategoryBracket 表,因为 price 将具有 DECIMAL 类型括号值,而 brand 将具有 @987654324 @。我的方向正确吗?
    • 看看这个真实世界的故事,这个故事讲述了某个团队决定使用这种类型的“设计”,即 EAV 或实体属性值。这种类型的东西有它的位置,但不是所有的东西。 simple-talk.com/opinion/opinion-pieces/bad-carma
    • @Sean:精彩的阅读,谢谢!我理解这个问题,但仍然无法找出解决方案,我应该为字符串值、int 值创建差异表吗?并且类别将有一个 CategoryDataType 列,它会说明类别括号应该是 int 还是 string 等?并根据该重定向查询?如果您能找到一些时间发布答案,将对像我这样的学习者有很大帮助。谢谢
    猜你喜欢
    • 2011-11-19
    • 2019-09-03
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2018-01-29
    相关资源
    最近更新 更多