我正在使用PHP + MySQL编写一个小应用程序,现在遇到了一个对象,它有几个(目前为止有8个,但不会增加)与其相关的标志。虽然这些标志没有什么关联,但有一些组合是无意义的。该对象表示DB中的一行(也有一些保存/加载它的方法),因此选择存储方法也适用于此问题。
问题是 - 如何在代码和数据库中最好地表示它们? 我可以想到几种方式:
一种将它们存储在DB中的方法是作为按位标志的单个整数字段。然后在PHP端,我可以想象几种表示它们的方式:
- 只导出整数值并定义几个标志常量;让需要使用这些标志的每个地方执行自己的按位操作;
- 定义类方法
GetFlag()
、SetFlag()
和UnsetFlag()
,对私有整数变量执行按位操作;然后将其中一个标志常量作为参数传递给这些方法。 - 定义方法
GetFlagA()
、GetFlagB()
等(以及对应的Set和Unset方法); - 定义一堆成员变量,每个变量表示一个标志;在从DB加载时设置它们,并在保存时收集它们。
- 创建一个成员变量,它是所有标志值的数组。使用预定义的常量作为数组索引访问每个标志。同时,在加载/保存时填充/收集该数组。
另一种方法是将它们作为单独的BIT字段存储在DB中。在PHP中,这将转换为几个成员变量。我认为这会使查询变得复杂。
最后一种方法是为所有标志定义另一个表,并为标志和原始对象之间的多对多关系定义一个中间表。在我的看法中,这是最混乱的解决方案,考虑到否则只有大约3个表。
我没有做过很多PHP开发,所以不知道最佳实践是什么。在C#中,我可能会将它们存储为位标志,并创建对私有整数执行位操作的属性。但PHP没有属性(我正在使用最新的稳定版本)...
SELECT * FROM mytable WHERE field3 AND !field5;
- Christian!
,因为它们有一些...奇怪的问题。 - Brian Leishman