小编Ben*_*rne的帖子

实体 - 属性 - 值表设计

我目前正在为电子商务平台的产品部分设计数据库结构.它需要以这样的方式设计,使得可以销售具有无限多个不同属性的无限数量的不同类型的产品.

例如,笔记本电脑的属性可以是RAM,屏幕尺寸,重量等.书的属性可以是作者,ISBN,出版商等.

似乎EAV结构最合适.

  • 选择一个产品
  • 产品属于属性集
  • 属性集包含属性x和y
    • 属性x是数据类型datetime(存储在attribute_values_datetime中的值)
    • 属性y是数据类型int(存储在attribute_values_int中的值)
  • 每个属性定义表示类型(i,e,x具有列类型 - > datetype)

假设上述情况,我是否可以将选择加入attribute_values_datetime表以获取正确的数据而不获取结果集并在表已知的情况下构建第二个查询?构建这种类型的查询是否会有很大的性能损失,或者下面的内容会更合适(尽管功能较少)

  • 选择一个产品
  • 产品属于属性集
  • 属性集包含属性x和y
    • 属性x是数据类型datetime,但在attribute_values中存储为TEXT
    • 属性y是数据类型int,但在attribute_values中存储为TEXT

mysql sql database-design database-schema entity-attribute-value

26
推荐指数
1
解决办法
1万
查看次数

理解正则表达式

我厌倦了对正则表达式的恐惧.这篇文章的主题仅限于正则表达式的PHP实现,但是,任何通用的正则表达式建议显然都会受到赞赏(即不要将我与不适用于PHP的范围混淆).

以下(我相信)将删除数字之间的任何空格.也许有更好的方法,但我仍然想了解发生了什么.

$pat="/\b(\d+)\s+(?=\d+\b)/";
$sub="123 345";
$string=preg_replace($pat, "$1", $sub);
Run Code Online (Sandbox Code Playgroud)

通过这种模式,我的解释是:

  • \b 一个词边界
  • \d+ 一个或多个数字的子模式
  • \s+ 一个或多个空格
  • (?=\d+\b) 先行断言一个或多个数字后跟一个单词边界?
  • 把它们放在一起,搜索任何单词边界,然后是一个或多个数字,然后是一些空格,然后对它进行某种先行断言,并将结果保存在$ 1中,以便它可以替换模式?

问题:

  • 我的上述解释是否正确?
  • 什么是前瞻性断言?
  • 领先/和尾随的目的是什么/

php regex

18
推荐指数
2
解决办法
778
查看次数

使用Eloquent手动注入模型关系

如何将模型添加到另一个模型的关系数组中?

例如

  • 域名属于所有者.
  • 所有者拥有一个域名.
  • 我有$ domain(域的实例).
  • 我有$ owner(所有者的实例).

我想添加$domain,$owner->relations[]以便我可以$owner->domain稍后在我的代码中使用.

这样做的原因是,在一个特定的控制器中,我只需要来自每个模型的部分数据集,因此出于性能原因使用流利来查询连接,然后填充模型.

然后为了便于阅读,我想使用$owner->domain->id

$domain->owner()->associate($owner);给了我一个$domain->owner选择

但后来我无法解决相反的版本

$owner->domain()->associate($domain)
$owner->domain()->attach($domain)
Run Code Online (Sandbox Code Playgroud)

两者都会导致以下致命错误

调用未定义的方法Illuminate\Database\Query\Builder :: [attach | associate]()

注意:我不想保存任何东西,因为我已经加载了我需要的所有数据.

laravel eloquent laravel-5 laravel-5.1

13
推荐指数
1
解决办法
5838
查看次数

Laravel valet它有效

我正在尝试安装,Laravel valet但我一直在(当我访问domain.dev时):

It works! 
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多.例如:

remove valet 
stop apache (apachectl stop)
composer global require laravel/valet
valet install
valet restart
Run Code Online (Sandbox Code Playgroud)

但那对我不起作用.我也安装Laravel Homestead 在一个流浪盒中.也许这与它有关?我可以访问我的Homestead网站.

我该如何解决这个问题?

laravel laravel-valet

11
推荐指数
2
解决办法
6635
查看次数

MySQL DDL Trigger,用于列重命名的Diff表模式

我正在创建一个PHP脚本来比较两个数据库的模式.

我已经设法检查有关删除/添加的表,列,索引,引用的架构更改,但是当涉及到重命名的列时,我有点卡住了.

在以下示例中,源数据库包含最新的模式,目标数据库包含类似的模式,但可能已过期.

先决条件:

  • 我不知道自上次差异以来发生的变化.
  • 数据库中的数据不匹配,但架构应该在diff之后.

以目标数据库中的以下模式为例.

Field   Type    Null    Key Default Extra
field1  int(11) NO      NULL     
field2  int(11) NO      NULL     
field3  int(11) NO      NULL     
Run Code Online (Sandbox Code Playgroud)

然后在源数据库中假设以下模式.

Field   Type    Null    Key Default Extra
field1  int(11) NO      NULL     
field4  int(11) NO      NULL     
field3  int(11) NO      NULL     
Run Code Online (Sandbox Code Playgroud)

不知道什么明确发生,我无法确定是否field2改为field4途经DROP, ADD AFTERCHANGE COLUMN.以下两个查询在表结构方面实现了相同的结果,但使用前者丢失了数据.

(1)    ALTER TABLE `demo` DROP `field2`
       ALTER TABLE `demo` ADD `field4` INT( 11 ) NOT NULL AFTER `field1` 

(2)    ALTER TABLE `demo` CHANGE `field2` …
Run Code Online (Sandbox Code Playgroud)

php mysql diff triggers alter-table

10
推荐指数
1
解决办法
1752
查看次数

数据库行快照/修订

我正在寻找一个合适的过程来保存数据库中的行(及其关系)的修订或快照.

以电子商务平台为例 -

  • 客户创建订单.订单与帐单邮寄地址和送货地址相关联.
  • 然后,所述客户在其简档中更改其地址簿中的地址.
  • 原始订单的地址不应更改.

我看了几个概念,一个是重复的表,另一个是临时数据库,另一个是保留修订版ID和活动标志.

虽然我很欣赏没有人能真正告诉我最适合我应用的解决方案,因为这是一个容易接受意见的问题,我希望有人可能通过比较来证明优势/劣势.我已经阅读了很多关于SO的问题,以及关于各种实现的一些文章,但没有一个真正比较每个想法或指出它们最适合的地方.下面我概述了我对每个概念的理解.

重复的表

将信息存储在与需要快照的数据相关的行中.即在一个在线商店的订单表中的列中保留一个地址.

好处

  • 数据被分段为明确相关的表,不需要连接等.
  • 无需按照以下概念中的要求仅选择活动行.
  • 假设行有时间戳,则保留时态数据库的大部分好处

缺点

  • 复制
    • 模式(当多个表修订时特别有问题)
    • 使用ORM时的模型
    • 如果快照片段数据未更改并且已重新使用,则为数据.即如果订单10次,地址存储11次(订单+当前)
  • 处理相关表中插入所需的额外代码.

时间数据库/活动或当前行标志

"时间感知"的数据库行,即它们的上下文是两个日期时间之间的时间.数据可以在时间表位于时间表的上下文之间加入.

好处

  • 没有重复的架构或模型.在一个地方进行的更改.
  • ORM模型可以处理新行的创建,无缝标记为活动等.
  • 没有复制没有进行任何更改的行.即10个订单到1个地址存储地址一次.

缺点

  • 查询变得更复杂,因为连接/ where子句需要选择"活动"行.
  • 表格被历史数据堵塞,这些数据未经常选择/调用.

仅存储已更改的列,时间.

有一个表来跟踪所有表的更改并记下它所涉及的行以及它在时间方面何时有效.

好处

  • 在未经复制的未更改数据的情况下,在修订方面优化存储.

缺点

  • 将列版本与其他数据相结合,查询要复杂得多.

我已经在这里查看了以下有关SO和其他资源的问题

编辑:我没有用特定的DBMS标记这篇文章的原因,因为我希望这个概念尽可能多地与平台一起工作,目前是DBMS独立的,抽象层允许它与MySQL一起工作MSSQL但希望将来能够支持其他人.

database temporal-database

9
推荐指数
1
解决办法
1018
查看次数

MySQL COUNT(),SUM()和GROUP BY

我有一个关于MySQL的特殊问题.请查看下面的查询和结果集:

SELECT COUNT(c.Population) AS c, c.City AS cc
FROM City c
GROUP BY c.City
ORDER BY c.City;
Run Code Online (Sandbox Code Playgroud)

261 | Bristol
----------------
910 | London
----------------
241 | Manchester
----------------
Run Code Online (Sandbox Code Playgroud)

我想得到COUNTs的SUM,所以在这种情况下我想在下一行或新列中看到'1412',这并不重要.

有什么建议?我试图对此应用子查询,但我找不到合适的解决方案.

干杯

mysql

8
推荐指数
2
解决办法
1万
查看次数

使用bash更新ini文件中的var

我正在尝试编写一个bash脚本来配置服务器的各个方面.这里的上下文是用另一个值替换conf文件(ini格式)中的变量值.

背景是

[ssh-iptables]

enabled = false
Run Code Online (Sandbox Code Playgroud)

而我只需要将false更改为true.

通常我只是简单地做一下 sed

sed -i 's/^enabled = false/enabled = true/g' /etc/fail2ban/jail.conf
Run Code Online (Sandbox Code Playgroud)

enabled = false存在于多个地方.

我尝试过使用但awk没有成功

awk -F ":| " -v v1="true" -v opt="enabled" '$1 == "[ssh-iptables]" && !f {f=1}f && $1 == opt{sub("=.*","= "v1);f=0}1' /etc/fail2ban/jail.conf
Run Code Online (Sandbox Code Playgroud)

上面的内容源自这个论坛帖子,但我对如何在脚本中使用它以使其工作没有足够的理解.它似乎只是相当于cat /etc/fail2ban/jail.conf

我发现了一些相当长的脚本并不理想,因为这会发生在大量的ini文件中,所以我希望有人可以帮我纠正上面的代码或者指出我正确的方向.

如果这属于ServerFault,请道歉,但因为它的脚本而不是服务器配置本身的错综复杂,我在这里可能会更贴切.

bash

8
推荐指数
2
解决办法
8720
查看次数

避免响应页面的重复内容

我目前正在开发一个处理响应式设计的项目,整个布局应该使用HTML和CSS来实现.我知道可以使用java脚本将内容从一个列布局移动到另一个列布局而不重复内容,但是使用HTML和CSS可以实现相同的目的吗?

举例来说,下面会在桌面设计上呈现这样的效果

--page-------------------
|  --------  --------   |
|  |div 1 |  | div 2|   |
|  --------  --------   |
-------------------------
Run Code Online (Sandbox Code Playgroud)

但随后设计师已经转向移动设计的div1下方div2.

--page--------
|  --------  |
|  |div 2 |  |
|  --------  |
|  --------  |
|  |div 1 |  |
|  --------  | 
--------------
Run Code Online (Sandbox Code Playgroud)

显然,块级元素堆叠的自然方式是相反的方式.

--page-------------------
|  --------  --------   |
|  |div 1 |  | div 2|   |  <--- shown on desktop
|  --------  --------   |
|  --------             |
|  |div 1 |             |  <--- …
Run Code Online (Sandbox Code Playgroud)

html css responsive-design twitter-bootstrap

7
推荐指数
2
解决办法
5324
查看次数

如何使用 Dynamodb 全局表和 Lambda@edge 选择正确的区域?

我创建了一个 Lambda 函数,它从 DynamoDB 检索一些数据,并输出一些 JSON。我想做的是在 lambda@edge 中运行这个函数并生成一个响应,我可以使用 Cloudfront 缓存该响应。

\n\n

我面临的问题是,我在 DynamoDB 中的数据(当前)使用全局表复制到两个区域(us-east-2 和 eu-west-1),而 lambda@edge 显然在许多区域中运行。

\n\n

这让我无法使用AWS_REGION在 lambda 环境中使用。例如,如果请求在 us-west-1 中运行,环境变量将反映这一点,并且它会尝试从 us-west-1 检索数据,而数据实际上应该转到 us-east-2。

\n\n

虽然我承认我还没有尝试过这个(但)我想知道我是否可以在 Route53 中设置自己的基于延迟的路由,以将 ddb.mydomain.com 指向我使用的区域中 DynamoDB 的端点(假设 SAN 证书是)设置一下可以吗?

\n\n

我想也许我可以根据下面的示例映射代码中的区域

\n\n
const process = { env: { AWS_REGION: \'us-east-1\' } };\n\nconst regions = {\n  \'eu-west-1\': [\'eu-west-1\', \'eu-central-1\', \'...\'],\n  \'us-east-2\': [\'us-west-1\', \'us-east-1\', \'...\'],\n};\n\nconst activeRegions = Object.keys(regions);\n\nconst region = activeRegions.find(\n  key => regions[key].includes(process.env.AWS_REGION)\n) || activeRegions[0];\n\nconsole.log(region) // us-east-2\n
Run Code Online (Sandbox Code Playgroud)\n\n

这感觉维护起来比其价值要多,并且依赖于我对最佳选择区域的假设。我还必须保持我的区域列表是最新的。

\n\n

我可以仅使用该区域的前两个字母来限制当新数据中心稍微开放时更新它的需要,但它仍然不理想 …

amazon-dynamodb aws-lambda-edge

7
推荐指数
1
解决办法
2513
查看次数