目前的Postgresql版本已经为JSON内容引入了各种功能,但我担心的是我是否真的应该使用它们 - 我的意思是,还没有"最佳实践"已经确定哪些有效,哪些无效,或者至少我可以'找到它.
我有一个具体的例子 - 我有一个关于对象的表,除其他外,它包含该对象的备用名称列表.所有这些数据也将包含在JSON列中以供检索.例如(跳过所有其他不相关的字段).
create table stuff (id serial primary key, data json);
insert into stuff(data) values('{"AltNames":["Name1","Name2","Name3"]}')
Run Code Online (Sandbox Code Playgroud)
我将需要一些查询形式"列出其中一个altnames为'foobar'的所有对象." 预期的表大小大约为几百万条记录.可以使用Postgres JSON查询,也可以将其编入索引(例如,用于在JSON数组中查找元素的索引).但是,它应该以这种方式完成,还是不建议使用反常的解决方法?
当然,经典的替代方法是为该一对多关系添加一个附加表,其中包含主表的名称和外键; 这种表现很好理解.但是,这有其自身的缺点,因为它意味着该表与JSON之间的数据重复(可能存在完整性风险); 或者在每次请求时动态创建JSON返回数据,这会有自己的性能损失.
我经常需要制作一个在某些地方以某种方式可配置使用的核心功能 - 即,它可以使用算法A或算法B,具体取决于命令行开关; 如果以某种方式设置'debug'标志,或者让它向stdout输出额外的详细信息.
我该如何实现这样的全局标志?
我看到4个选项,所有选项都不是很好.
从函数中读取命令行参数 - 坏,因为需要IO monad并且核心计算函数都是纯的,我不想在那里得到IO;
将一个参数从main/IO一直传递到需要改变行为的'leaf'函数 - 完全不可用,因为这意味着改变不同模块中的十几个不相关的函数来传递这个参数,我想试试这样的配置选项多次,而不是每次都更改包装代码;
使用unsafePerformIO得到一个真正的全局变量-感觉丑陋和矫枉过正这样一个简单的问题;
在函数中间右侧有两个选项的代码,并将其中一个注释掉.或者使用do_stuff_A和do_stuff_B函数,并根据全局函数的含义更改调用哪一个函数needDebugInfo=True.这就是我现在正在做的事情debuginfo,但它无法通过重新编译来改变,它不应该是最好的方式......
我不需要或想要全局可变状态 - 我希望有一个简单的全局标志,它在运行时是不可变的,但可以在程序启动时以某种方式设置.有什么选择吗?
我一直想知道如何正确使用REPL编写可重用代码,而不是一次性实验.关于REPL开发风格的各种优点有很强的意见,我想在实践中检查一下,但我不明白预期的工作流程是什么.
假设我在REPL中打开现有模块(+ sample/test data),并以交互方式创建新功能/修复错误.非常成功 - 它现在按照预期的方式使foobar frobnic!但现在呢?我怎么能把更改和添加回到我的模块和版本控制中?
将所有REPL状态转储到文件只能用于初始创建,而不能用于修改或添加现有代码(因此,几乎所有开发) - 它需要保留诸如模块,注释等之间的分割等.从REPL进行复制历史到每个文件的相关点似乎是繁琐的工作,很容易出错.如何确保修改后的函数具有我在REPL中的最终版本,并且我没有忘记一些?
建议的最佳做法是什么?
恕我直言,问题是语言无关,但如果没有,让我们假设Haskell或Python,因为Lisp是一个自己的世界,我对它不够熟悉.
我需要按特定小时过滤掉数据.DataFrame函数between_time似乎是正确的方法,但它只适用于数据帧的索引列; 但是我需要以原始格式存储数据(例如,数据透视表将期望datetime列具有正确的名称,而不是索引).
这意味着每个过滤器看起来像这样:
df.set_index(keys='my_datetime_field').between_time('8:00','21:00').reset_index()
Run Code Online (Sandbox Code Playgroud)
这意味着每次运行此类过滤器时都会进行两次重建索引操作.
这是一个很好的做法还是有更合适的方法来做同样的事情?