简单的问题 - 在2012年需要与ACID兼容的中型/大型数据库会更好.
我已经阅读了关于mySQL vs pgSQL的所有内容(大多数内容),但大多数内容分别与版本4,5.1和7,8有关并且过时(2008,2009).它几乎是2012年,所以我想我们可以尝试重新审视这个问题.
基本上我想知道PostgreSQL中是否有任何东西超出了MySQL的易用性,可用性和更大的开发人员/知识库.
MySQL的查询优化器仍然是愚蠢的吗?在非常复杂的查询上它仍然超级慢吗?
打我!:)
PS.不要把我送到护目镜或维基.我正在寻找一些不是概述的具体要点+我相信StackOverflow比一些随机页面更能让'聪明的家伙'发光.
附录
项目规模:假设一个订单系统,每个帐户大约10-100个订单/天,几千个帐户,最终,每个可以有几百到几千个用户.
擅长:在需求不断增长和变化时具有前瞻性和灵活性.在硬件部门保持低成本方面,性能也很重要.此外,熟练劳动力的可用性也是一个因素.
OLTP或OLAP:OLTP
理论上的问题可能没有任何意义但仍然存在,也许有一个聪明的答案.
我想迭代数组并获取它的键和它们的东西.我做的一个简单例子:
foreach($array as $key => $value) {
$other_array[$key] = 'something';
}
Run Code Online (Sandbox Code Playgroud)
现在,在此范围内未使用的PHP Mess Detector
尖叫声$value
.因此,我在想,也许这不是访问keys
我的最佳方式array
.
知道如何做到这一点,没有不必要地取出values
我的array
?它是否有任何重大的性能影响...或者我可能只是偏执狂,应该继续下去而不浪费任何人的时间与愚蠢的问题:).
一个问题:
我有2张桌子:
Product
id INT
name VARCHAR(64)
something TEXT
else INT
entirely BOOL
Run Code Online (Sandbox Code Playgroud)
和
Ingredient
id INT
name VARCHAR(64)
description TEXT
Run Code Online (Sandbox Code Playgroud)
现在我还有一个链接表
Products_Ingredients
product_id INT
ingredient_id INT
Run Code Online (Sandbox Code Playgroud)
为了我的多对多关系.
现在,产品和配料都有独特的名称.所以我可以使用名称作为自然键...但这是一个好主意吗?
说我有一个产品:Paint Thinner Supreme
含有成分:Butylonitrotetrocycline
将这些名称用作链接表中的复合键是否是一个好主意?
尽管我理解在代理人之上使用自然键背后的想法,我有点不能不再认为使用简单整数作为主键(和外键)会更快.MySQL服务器消化这些不同密钥的方式会有区别吗?
你有什么意见?
mysql database database-design foreign-keys relational-database
快问.如果我将使用十进制字段限制或十六进制(例如16,32,64而不是10,20,50),从存储数据的角度来看是否重要?
我问,因为我想知道这是否与HDD上的集群有关?
谢谢!
我有一个问题,我遇到了一段有趣的代码.在MySQL语句中有类似的东西:
{...} ORDER BY whatever = 3 ASC,无论= 4 ASC,无论= 6 ASC {...}
这是否意味着它将以这种方式订购?:
thing | whatever
15 | 1
1 | 3
5 | 3
8 | 3
2 | 4
3 | 4
6 | 4
4 | 6
7 | 6
9 | 6
14 | 9
21 | 10
18 | 9
...
Run Code Online (Sandbox Code Playgroud)
它似乎只是排序等于3,4和6休息是无序的...
这是正确/支持的语法吗?
我有一个实质性的数据库...不是一个非常大的数据库 - 总共约1GB的数据.
我需要从几个表中删除一些行.例如,我有一张桌子
Order
id | ... | status | ...
1 | ... | 1 | ...
...
40 | ... | 20 | ...
41 | ... | 1 | ...
...
470000 | ... | 12 | ...
Run Code Online (Sandbox Code Playgroud)
现在我要删除所有的订单 status=1
我认为我这样做:
DELETE FROM Order WHERE status = 1
看起来很简单,但需要很长时间!当我运行此查询时,它仍然在40分钟后以100%的CPU使用率运行...当我杀死进程时没有删除任何内容.
当我尝试使用时限制范围
DELETE FROM Order WHERE status = 1 AND id <1000
删除约200行需要几分钟....
我的配置中是否有任何遗漏?我应该寻找/检查/改变什么?任何想法都是为什么它如此血腥低效?
让我补充一点,我通常使用MySQL并且需要管理这个postgres数据库但是对postgres没有任何经验,所以它可能非常简单.
索引同时包含id和status列.
表有大约500k行,大约一半需要删除.
执行计划:
Delete (cost=0.00..19474.19 rows=266518 width=6)
-> Seq Scan on Orders (cost=0.00..19474.19 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一个RBAC
带有扭曲的数据库(或者也许只有我认为它是扭曲的?)。据我所知,RBAC
使用角色和权限来授予/拒绝对系统中某些对象的访问。当我只有一个站点实例并且只需创建一个角色 ' Main admin
'、' Secondary admin
'、' User
' 等时,一切都变得美好而清晰。
但是,如果我在系统中有帐户怎么办?所以我有一个系统,其中有“ London
”、“ Tokyo
”和“ Moscow
”帐户。现在我将为每个帐户设置“主管理员”,以及每个帐户中的许多“用户”——当然,莫斯科人应该无法登录伦敦帐户。我该怎么做?我是否创建了一些额外的表,将分配到用户的帐户绑定?或者我是否将 accountid 添加到分配表?或者也许我应该创建多个角色,如“moscow_main_admin”、“london_main_admin”等。这种情况的最佳方法是什么?
另外我相信我会有一些用户是伦敦帐户的“主管理员”和东京帐户的“次要管理员”。
我计划将 Yii 与它内置的 RBAC 一起使用......如果这有什么不同的话。
如何解决?
先感谢您!
关于如何为命令行执行此操作的大量答案
convert /path/to/file/file.pdf[3] output.jpg
Run Code Online (Sandbox Code Playgroud)
很好...但是如果我在内存处理中使用,我会用 PDFlib 生成 PDF,然后将其缓冲区输出到我想要生成所选页面的 jpg 预览的函数。如何?我的代码:
[...]
$buf = $pdf->get_buffer();
//$buff is just a PDF stored in a string now.
$im = new Imagick();
$im->readimageblob($buf);
$im->setImageFormat("jpg");
$im->setimagecompressionquality(60);
$len = strlen($im);
header("Content-type: image/jpeg");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=test.jpg");
echo $im;
Run Code Online (Sandbox Code Playgroud)
这将创建一个 jpeg,但始终返回 PDF 的最后一页。我希望能够选择要转换哪一个。不保存临时文件和使用命令行(exec('convert /path/to/file/file.pdf[3] output.jpg'))
语法是否可行?
让我补充一下,我试过
$im->readimageblob($buf[2]);
Run Code Online (Sandbox Code Playgroud)
它没有用:)
我有一个“战略”问题。
事情是,我们有一张客户地址和客户订单的表格。结构类似于(只是一个例子,忽略归档类型等):
Address
id INT
line1 TEXT
line2 TEXT
state TEXT
zip TEXT
countryid INT
Run Code Online (Sandbox Code Playgroud)
为了保持数据的历史有效性,我们将这些地址与订单一起存储在文本字段中(以前它是通过引用完成的,但这是错误的,因为如果地址更改,所有旧订单也会更改交货地址,这是错误的)。例如:
Orders
id INT
productid INT
quantity INT
delivery_address TEXT
Run Code Online (Sandbox Code Playgroud)
delivery address
类似于 CONCAT_WS("\n",line1,line2,state,zip,country_name)
一切都很好,很花哨,但是似乎客户需要访问历史数据并能够以 XML 格式导出这些数据,他们希望再次正确拆分这些行。因为有时没有 line2 或 state 或 zip 或其他什么,我们如何以一种方式存储这些信息,然后我们可以破译每行的“标签”?
建议存储为 JSON 编码的数组,但这是最好的方法吗?我想将它存储为 XML ……或者创建那些 6-10 个额外的列并为每个订单存储地址数据?也许你们中的一些人在处理这种事情方面有更多的经验,并且能够为我指明正确的方向。
提前致谢!
据我所知,自然键的纯粹主义者和代理键的纯粹主义者之间正在发生战争.喜欢这个帖子(有更多)人们说'自然键对你不好,总是使用代理...
但是,无论是我是愚蠢还是盲目,但我总是看不到有代理钥匙的理由!
假设您在配置中有3个表,如下所示:
为什么我需要一个代理键?我的意思是没有它是完全合理的.
此外,有人可以解释为什么主键不应该根据代理键纯粹主义者改变?我的意思是,如果我说color_id VARCHAR(30)
了一把钥匙black
,并且我不再需要黑色,因为我正在改变它charcoal
,为什么改变black
键charcoal
和所有引用列也是一个坏主意?
编辑:刚刚注意到我甚至不需要改变它!只需创建一个新的,更改引用列(与我将使用代理键相同)并保持旧的安全....
在代理关键口头禅我需要创建额外的条目,比如id=232
和name=black
.这对我有什么好处?我在表中有一个备用钥匙,我不再需要了.另外我需要加入才能得到一个颜色名称,否则我可以留在一张桌子上并且快乐吗?
请向5岁的人解释一下,请记住,我并不是说"代理关键是不好的",我试图理解为什么会有人说'总是使用代理键!'.
sql ×5
mysql ×4
database ×2
php ×2
postgresql ×2
arrays ×1
foreach ×1
foreign-keys ×1
imagemagick ×1
imagick ×1
natural-key ×1
pdf ×1
rbac ×1
rdbms ×1
sql-order-by ×1
yii ×1