按位运算是否适合解决以下问题?

Is bitwise operation the right one to solve the following?

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

这是我将如何组织数据的 table 架构。 第一个是 StoneInfo,其中包含有关的基本信息 像“unique_id, stone_id, stone_name, creation_time, last_purchase_time, generation_status”

unique_id - 是一个随机生成的id - 这个是为了和其他保持外键关系 table StoneMetaDetails

石头信息

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

为了避免第二次规范化异常,我分成了两个 table。这里包含了指定维度中每种石头的生成状态的详细信息。创建状态类似于

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

我想维护每一种石头的创造状态(它们可能有不同的味道和尺寸)。我想要的只是最小化 read/write 对 table 的操作以便更快地访问。

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

GENERATION_STATUS - 当它是 ("generated" or "on hold for some reasons" or "the generation process have started/initialized") 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

这样我就可以在不加入其他人的情况下获得它 table 以便更快地访问。

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

stone_id 及其在 StoneInfo table 中的 generation_status。因此 generation_status 包含状态值,与石头类型及其尺寸无关。

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

这可以借助按位或吗?我走的路对吗?或者请向我推荐一个更好的方法来处理这个问题。

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

简单的答案是你的方向是正确的

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

请参阅 this link 了解更基本的解释,我建议使用它并将一些测试数据放入您的数据库,然后 运行 一些查询来比较结果。 您可能会看到,将它们保留在两列中并在它们之间进行“或”操作并将两列都保留为减少的位数可能会更快。我没有检查过这个,但是 theoratically(DBA 很贵,存储很便宜)最好将 Stone Type status 和 Generation status 放在一个单独的列中,只需要 8 位来涵盖 256 种状态等的组合

试试吧。

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

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

|运算符"ors"将两个位串组合在一起。这对 SET 很好用,但对 SET.

的一位意义不大

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

一个不相关的问题...在 table 上设置 3 个唯一键很少有意义,就像您在 StoneInfo 上那样。