我正在用 PHP + MySQL 编写一个小型应用程序,并且已经到了一个对象有几个(目前为 8 个,但预计不会增加)与之关联的标志的地步。这些标志几乎没有关系,尽管有些组合没有意义。该对象代表数据库中的一行(也有一些保存/加载它的方法),所以这个问题也适用于选择存储方法。
问题是 - 如何在代码和数据库中最好地表示它们?我可以想到几种方法:
将它们存储在数据库中的一种方法是在单个整数字段中作为按位标志。在 PHP 方面,我可以想象几种表示它们的方式:
GetFlag()、SetFlag() 和 UnsetFlag() 对私有(private)整数变量执行按位魔法;然后将这些方法作为参数传递给标志常量之一。GetFlagA()、GetFlagB() 等(以及 Set 和 Unset 对应方法);另一种方法是将它们作为单独的 BIT 字段存储在数据库中。在 PHP 中,这将转换为几个成员变量。恕我直言,这会使查询复杂化。
最后一种方法是为所有标志定义另一个表,并为标志和原始对象之间的多对多关系定义一个中间表。恕我直言,这是所有解决方案中最困惑的,否则只有 3 张 table 。
我没有做过太多的 PHP 开发,所以我不知道最佳实践是什么。在 C# 中,我可能会将它们存储为按位标志,并创建对私有(private)整数执行按位魔术的属性。但是 PHP 没有属性(我使用的是最新的稳定版本)...
最佳答案
在你的model , 该对象有 8 个 bool 属性。这意味着数据库表中有 8 个 bool 值(MySQL 的 TINYINT)列,对象中有 8 个 getter/setter 方法。简单而常规。
重新考虑您当前的方法。想象一下下一个必须维护这个东西的人会说什么。
CREATE TABLE mytable (myfield BIT(8));
好的,看来我们要在这里生成一些二进制数据。
INSERT INTO mytable VALUES (b'00101000');
等等,有人再告诉我这些 1 和 0 分别代表什么。
SELECT * FROM mytable;
+------------+
| mybitfield |
+------------+
| ( |
+------------+
什么?
SELECT * FROM mytable WHERE myfield & b'00101000' = b'00100000';
WTF! WTF!?
用刀捅自己的脸
-- 与此同时,在仙女与 unicorn 玩耍、程序员不讨厌 DBA 的平行宇宙中......--
SELECT * FROM mytable WHERE field3 = 1 AND field5 = 0;
幸福与阳光!
关于php - PHP 中位标志的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429104/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的
我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http
我想将“US”之类的国家代码转换为表情符号标志,即将“US”字符串转换为Ruby中适当的Unicode。Here'sanequivalentexampleforJava 最佳答案 使用tr将字母字符转换为其区域指示符号:'US'.tr('A-Z',"\u{1F1E6}-\u{1F1FF}")#=>"??"当然你也可以直接使用Unicode字符:'US'.tr('A-Z','?-?')#=>"??" 关于ruby-从Ruby中的国家代码获取表情符号标志,我们在StackOverflow上找
我有一个像这样的ruby散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin