【问题标题】:How to classify Products in tree table with three level of classifications如何用三级分类对树表中的产品进行分类
【发布时间】:2017-03-10 10:06:48
【问题描述】:

我正在为销售管理构建 c# 项目

我做了表格来登记订单(销售物品)和表格来登记物品进入我的仓库

如您在商店中所知道的,例如您可能会销售 50 英寸的 LED 屏幕或 32 英寸的 LED 屏幕 或者每个屏幕规格是什么,或者它是什么产品

现在,如果我想知道在特定日期、周、月或年期间我销售了多少屏幕以及仓库中仍有多少屏幕 无论屏幕规格如何(尺寸、类型 LED LCD)

所以我想用有意义的标识符对新表(Product_Classification) 中的产品进行三个级别的分类 然后在这些表中包含那个有意义的标识符,这样我就可以查询我想要的任何统计信息,例如

我一天、一周、一个月或一年卖出了多少屏幕? 我一天、一周、一个月或一年卖出了多少个 50 英寸的屏幕?...等等

我打算格式化该标识符并将其分为 3 个部分,每个部分有 4 个数字,每个部分链接到 该树中的一个级别 XXXX-XXXX-XXXX

示例 1

PK_ID |    Full_identifier     | identifier_Description       | class1_ID | class1_Description | class2_ID | class2_Description | class3_ID | class3_Description 
  1   | 1122                   | electronic devices           |           |                    |           |                    |           |     
  2   | 11223344               | electronic devices           |   3344    | LED screen         |           |                    |           |     
  3   | 112233445566           | electronic devices           |   3344    | LED screen         |   5566    |   32 Inch          |           |     
  4   | 1122334455668899       | electronic devices           |   3344    | LED screen         |   5566    |   32 Inch          |    8899   |     Sony Brand

这个 Full_identifier 的优点:

  • 正如您所见,Full_identifier 的每 4 位数字将允许我访问该分类的一个级别,就像我可以使用查询所有电子设备一样 Full_identifier 1122 的第一部分或 使用Full_identifier 11223344的前两部分查询所有LED屏幕

  • 实现它的另一个原因,当用户想从 UI 中注册仓库中的产品时,他不必选择 4 个类别来对产品进行分类,在我的 UI 中只有一个 dropdown list 将在运行时从这个表Product_Classification 构建,当用户开始输入嵌套可用分类列表时会自动完成,当他选择一个类别时,Full_identifier 将存储在所需列中,所以每当我需要任何子-树表中的类别我可以根据用户选择的级别通过子串Full_identifier立即访问它

  • 对于统计报告,如果我想列出所有 LED 屏幕,我可以简单地使用 Full_identifier 的第二部分 3344 来完成,如下例所示
> SELECT Full_identifier,
>           identifier_Description
>        || ' - '
>        || class1_Description
>        || ' '
>        || class2_Description
>        || ' '
>        || class3_Description
>           AS PRODUCT_Classification   FROM PRODUCT_CLASSIFICATION  WHERE Full_identifier = 3344

如果我想列出所有索尼品牌的产品,我可以简单地使用 Full_identifier 的第二部分 8899 来完成,如下例所示

SELECT Full_identifier,
          identifier_Description
       || ' - '
       || class1_Description
       || ' '
       || class2_Description
       || ' '
       || class3_Description
          AS PRODUCT_Classification   FROM PRODUCT_CLASSIFICATION  WHERE Full_identifier = 8899

问题

如果我为每个级别使用sequence class1_ID,如何管理 identifier,只有在 class1_Description 未更改时才会增加

我可以使 identifier 独一无二,但不能像 recommended here 那样 PK

这是否可行并且实施得很好?

【问题讨论】:

  • 使用这种格式化标识符有什么好处?
  • @BobC 在我的问题中写道,Full_identifier 的每 4 位数字将允许我访问该分类的一个级别,我可以使用 Full_identifier 1122 的第一部分查询所有电子设备或查询所有 LED使用 Full_identifier 11223344 的前两部分进行筛选
  • 这是一个“如何”,但问题是“为什么”?
  • 没有它如何构建列完整标识符我的朋友如何生成该列?如何控制?
  • 这是重复的。继续讨论为什么这是一个坏主意。 stackoverflow.com/questions/42704445/…

标签: c# oracle c#-4.0 oracle12c database-administration


【解决方案1】:

回答您的具体问题:

这可能吗?是的 执行得好吗?没有。

多部分或“智能”键不是一个好主意。现在任何查询都需要子串化或解码。用户如何指定他或她想要的级别?事实上,看你的桌子设计,你已经有了描述产品的属性,和一个PK。所以我认为这没有用。

【讨论】:

  • hmm...那他们为什么要在护照和社会安全号码上使用类似的东西?什么是好的实现?
  • 我不确定我是否理解您的评论?他们是谁”?为什么我要给我的护照号码加上字符串?
  • 一般来说大多数国家的护照号码和国家安全号码都有意义
  • 在医疗保健领域,药品有一个称为 NDC 的国家药品标识符。它总共是 11 位数字,但实际上分为 3 个部分。而且它的价值是业内人所熟知的12345-6789-11
  • 我想到了一些事情。这些数字及其格式可能是在关系数据库之前发明的。所以这些都是 COBOL 和 ISAM 时代的遗产(或者甚至更早)。在关系数据库中,这样做没有任何意义。在您的示例中,如果您想查询 class1_ID=3344,则编写“select blah where class1_ID=3344”。简单的。或者甚至更好,“select blah where class1_Description='LED Screen'” 简单易懂。你还没有给出一个很好的理由来实施你的建议。如果您不相信我,请尝试交叉发布到数据仓库...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2010-10-16
  • 2010-10-19
  • 2020-01-05
  • 2018-12-10
相关资源
最近更新 更多