0

我正在为一家大理石制造公司创建一个应用程序,以跟踪给定宽度和高度的大理石生成过程。这会跟踪

这是我将如何组织数据的表模式。第一个是StoneInfo包含有关石头的基本信息,例如“unique_id、stone_id、stone_name、creation_time、last_purchase_time、generation_status”</p>

unique_id - 是一个随机生成的 id - 这是为了与另一个表保持外键关系StoneMetaDetails

石头资讯

UNIQUE ID        (Primary key)
STONE ID         (Indexed & Unique key)
STONE_NAME       (Indexed & Unique key)
CREATION_TIME  
LAST_PURCHASE_TIME
GENERATION_STATUS

为了避免第二次归一化异常,我分成了两个表。此处包含有关指定维度中每种石头的创建状态的详细信息。创建状态类似于

CREATED_SUCCESSFULLY
CREATION_INPROGRESS
CRAETION_ON_HOLD_DUE_TO_LESS_REQUIREMENT
CREATION_ON_HOLD_DUE_TO_LACK_OF_RESOURCE
CREATION_ON_HOLD_DUE_TO_LACK_OF_MACHINE
CREATION_ON_HOLD

StoneMetaDetails

UNIQUE ID          (FOREIGN KEY with on delete cascade)
FORMAT             (PRIMARY KEY)
DIMENSION          (PRIMARY KEY)
CREATION_STATUS
STORE_NAME
WEIGHT
QUANTITY_AVAILABLE
MACHINE TYPE/MACHINE ID

我想保持每一种石头的创造状态(它们可能有不同的味道和尺寸)。我想要的只是最小化表上的读/写操作以便更快地访问。

我正在维护两个状态值,例如GENERATION_STATUSCREATION_STATUS因为

GENERATION_STATUS- 当它是(“生成”或“由于某些原因暂停”或“生成过程已开始/初始化”) CREATION_STATUS时 - 保持跟踪特定石头类型及其尺寸的确切状态值。

在这里,我试图在GENERATION_STATUS按位或运算的帮助下将这两个列值与列值合并 - 通过分配不同的常量值(在 2^ 关系中)

//All these values are meant for stone type

public static final long STONE_TYPE_MARBLE_20_X_30 = 2;
public static final long STONE_TYPE_MARBLE_50_X_60 = 4;
public static final long STONE_TYPE_MARBLE_10_X_60 = 8;
public static final long STONE_TYPE_MARBLE_20_X_60 = 16;
public static final long STONE_TYPE_MARBLE_40_X_60 = 32;
public static final long STONE_TYPE_MARBLE_60_X_60 = 64;


public static final long STONE_TYPE_LIMESTONE_10_X_30 = 128;
public static final long STONE_TYPE_LIMESTONE_10_X_40 = 256;

public static final long STONE_TYPE_TRAVERTINE = 512;
public static final long STONE_TYPE_MARBLE = 1024;
public static final long STONE_TYPE_GRANITE = 2048; (2^11)

//Have alloted values for 2^0 to 2^14 for stone type 
//All these variables are meant for representing creation/generation status of a stone 
public static final long GENERATION_SUCCESS = 2^15;
public static final long GENERATION_IN_PROGRESS = 2^16;
public static final long GENERATION_ON_HOLD_DUE_TO_MINIMAL_REQUIREMENT = 2^17;
public static final long GENERATION_ON_HOLD_DUE_TO_LACK_OF_MACHINE = 2^18;


public static final long GENERATION_ON_HOLD_DUE_TO_MACHINE_COULD_NOT_GENERATE = 2^19;

//Some ten to fifteen different types of generation error values may be possible

这样我就可以在不加入另一个表的情况下获得它,以便更快地访问。

为了更清楚,我正在尝试映射,

stone_id及其generation_statusStoneInfo表中。因此,generation_status无论石头类型及其尺寸如何,它都包含状态值。

IE; (STONE_A_10_X_20 | GENERATION_SUCCESS) | (STONE_A_20_X_30 | GENERATION_INPROGRESS) 在单个列中。

这可以在按位或的帮助下实现吗?我走对了吗?或者请建议我以更好的方式处理这个问题。

感谢您耐心阅读这个长长的问题故事 :)

4

2 回答 2

1

简单的答案是你正朝着正确的方向前进

据我了解,您已经知道此操作背后的逻辑,因此要确认这是在单个字段中存储多个状态的正确方法,我们可能必须查看其他内容,并且在实现此操作时差异可能可以忽略不计。

有关更多基本解释,请参阅此链接,我建议您使用它并将一些测试数据放入您的数据库,然后运行一些查询来比较结果。您可能会看到将它们保留在两列中并在它们之间进行 OR 并保持两列减少位数可能会更快。我没有检查过这个,但理论上(DBA 很贵,存储很便宜)最好将 Stone Type 状态和 Generation 状态放在一个单独的列中,只需 8 位来覆盖 256 种状态等的组合。

试试看。

于 2017-03-09T17:41:11.400 回答
0

在 MySQL 中,有两种相关的数据类型:

  • ENUM-- 存储为 1 或 2 字节整数,表示 N 个值中的 1 个。(N 被限制为 64K 值——但即使是几百也是笨拙的。)
  • SET-- 存储为一个更大的整数,并且(内部)包含 1 位值的任意组合(1、2、4、8 等,就像您在代码中描述的那样)。(设置限制为 64 位,a la BIGINT。)
  • 两者都ENUM使用SET任意字符串(不是数字)来表示值。

运算符将|两个位串“或”在一起。这适用于SET,但对于 a 的一点意义不大SET

generation_status作为一个,而不是一个集合是有意义的ENUM——毕竟,状态一次只能取一个值,对吗?所以,一个涉及到的布尔表达式GENERATION_SUCCESS需要说(generation_status = "GENERATION_SUCCESS"),它解析为 TRUE 或 FALSE,表示为 1 或 0,可以在 Boolean|或 Logical中使用OR

一个不相关的问题......在一张桌子上拥有 3 个唯一键几乎没有意义,就像您在 StoneInfo 上所拥有的那样。

于 2017-03-13T22:37:34.900 回答