我一直在阅读有关EAV数据库的信息,大多数缺点似乎都与真的,真的,错误的EAV设计或从数据生成报告的难度有关。
通常,当您看到人们抱怨EAV时,他们使用少于三个的表来尝试复制RDBMS中单独的表+列的功能。有时,这意味着将所有内容(从小数到字符串)都存储在单个TEXT值列中。EAV还会破坏数据完整性的安全保护措施,如果您不小心的话,这可能会很糟糕。
但是,EAV确实提供了一种轻松的方式来跟踪历史数据,并允许我们在SQL和键值存储系统之间来回移动系统的某些部分。
如果我们根据类型区分不同的实体属性该怎么办。除了与特定属性和实体相关的正确索引值之外,这还使我们仍然可以处理belongsTo,Has,HasMany和HasManyThrough关系。
考虑以下两个基本实体
products (price -> decimal, title -> string, desc -> text, etc...)
attributes
options
[...]
int
datetime
string
text
decimal
relation
[id,foreign_key]
users (gender -> options, age -> int, username -> string, etc...)
attributes
options
[...]
int
datetime
string
text
decimal
relation
[id,foreign_key]
Run Code Online (Sandbox Code Playgroud)
众所周知,用户资料和产品是世界上最多样化的产品。每个公司处理它们的方式都不一样,并且针对他们的需求具有不同的“列”或“属性”。
以下是如何处理多个(嵌套和/或关系)实体的视图。
想法是,对于每个实体都有此主属性表,然后该主表指定如何查找和解释这些值。这使我们能够处理特殊情况,例如指向其他实体的外键以及诸如“选项”或十进制数字之类的东西。
entity_type {id,type,//即“博客”,“用户”,“产品”等。created_at}
entity {
id,
entity_type_id,
created_at
}
attr {
id,
entity_id,
type,
name,
created_at
}
option {
id,
attr_id, …Run Code Online (Sandbox Code Playgroud) 如何使图像居中而不遮盖下面的段落?position: absolute;或float: left;两者都会引起问题。
<p>This is the first paragraph</p>
<p><img src="http://placekitten.com/600/280"/></p>
<p>Paragraph 3</p>
Run Code Online (Sandbox Code Playgroud)
假设以下CSS:
p { width: 100px; margin: 0 auto}
Run Code Online (Sandbox Code Playgroud)
我还想确保较大的img元素不是overflow:hidden由父p标记引起的。我想查看完整的图像,即使它太大也是如此。
大多数站点至少采用服务器访问日志检查和禁止以及某种机器人预防措施,如CAPTCHA(那些混乱的文本图像).
CAPTCHA的问题在于它们可能对用户体验构成威胁.幸运的是,它们现在具有用户友好的功能,如刷新和音频版本.
无论如何,像linux vs windows一样,垃圾邮件发送者自定义和/或构建脚本以处理仅与一个站点相关的自定义CAPTCHA示例是不值得的.因此,我想知道是否有更好的方法来处理整个CAPTCHA的事情.
在更好的CAPTCHA中, Peter Bromberg提到,一种方法是将图像转换为HTML并将其显示在页面中.在http://shiflett.org/上, Chris只是要求用户在输入中输入他的名字.这样的例子是简化CAPTCHA体验同时降低垃圾邮件发送者价值的方法.有没有人知道我可以使用的更好的例子或看到嵌入式图像的任何问题?
有谁知道我在哪里可以找到关于人们用两种或更多脚本语言实现的任务的评论或报告,以查看哪种更适合特定的工作?我想知道哪种语言最适合哪种类型的操作,以便我可以充分利用它们.
"操作类型"可以是套接字,文件系统,逻辑评估,正则表达式或绘图.
我最感兴趣的是Python,PHP,Perl和Ruby.
我有一个表格,上面有一个简单的上/下投票列,我最初创建的是一个布尔值.true是一个投票,false是一个投票下来.但是,我不确定如何使用聚合函数来实现这种查询结果.例如,5 true行和2 false应该等于+3的投票.
我想我需要将列更改为带有+1和-1的smallint.它是否正确?有没有更好的方法来查询这样的东西?
当我在其中有一个带有该方法名称的变量时,我会检查是否存在JavaScript方法.
使用PHP我可以这样做:
$method = 'bar';
$object = new Foo;
if(method_exists($object, $method))
{
//Foo->bar()
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在JavaScript中执行此操作?我的第一次尝试失败了
var method = 'bar';
if(typeof(obj.method) != "undefined")
{
obj.method();
}
else
{
obj.default();
}
Run Code Online (Sandbox Code Playgroud) 好的,因此哈希的整个问题是用户不会输入长度超过15个字符的密码.大多数人只使用4-8个字符,使攻击者很容易用彩虹表破解.
解决方案,使用用户salt使哈希输入更复杂,超过50个,这样他们就永远无法生成一个表(对于那些大小的字符串来说是大的).另外,他们必须为每个用户创建一个新表.问题:如果他们下载数据库,他们将获得用户盐,所以如果他们足够关心你就回到原点.
解决方案,使用网站"胡椒"加上用户盐,然后即使他们得到数据库,他们仍然必须知道配置文件.问题:如果他们可以进入您的数据库,他们可能也会进入您的文件系统并发现您的网站.
因此,所有这些都已知 - 让我们假设攻击者进入您的网站并获取所有内容,一切都是如此.那你现在做什么?
在讨论的这一点上,大多数人回答"谁在乎这一点?".但这只是一种廉价的说法,"我不知道下一步该做什么,所以它不可能那么重要".可悲的是,在其他任何地方我都问过这个回答的问题.这表明大多数程序员都错过了一个非常重要的观点.
让图像显示您的网站就像其他95%的网站一样,用户数据 - 甚至是完全的服务器访问 - 都不值得蹲下.攻击者碰巧是在你的一个用户"Bob"之后,因为他知道"Bob"在你的网站上使用与在银行网站上使用相同的密码.他也碰巧知道鲍勃在那里有他的人生储蓄.现在,如果攻击者可以破解我们的网站哈希,剩下的将是小菜一碟.
所以这是我的问题 - 如何在没有任何可追踪路径的情况下扩展密码的长度?或者,如何使哈希过程复杂化并及时复制?我唯一想到的就是你可以重新散列数千次哈希,并将创建最终彩虹表所花费的时间增加1000倍.这是因为攻击者在创建表时必须遵循相同的路径.
还有其他想法吗?
我正在寻找可用于在有趣的项目上工作时压缩PHP代码的巧妙技巧.让我分享一下迄今为止我所知道的一些内容.
使用没有括号的直接条件
if(TRUE)yes();else no();
Run Code Online (Sandbox Code Playgroud)
您可以在一行中获取和验证变量
if(!($value=function($input)||empty($value->foo))return FALSE;
Run Code Online (Sandbox Code Playgroud)
您可以使用PHP 5.3中的Ternary运算符检查值(和默认值)
$foo = $bar?:NULL;
Run Code Online (Sandbox Code Playgroud)
返回条件的布尔值
return!$foo;
Run Code Online (Sandbox Code Playgroud)
我放在我的PHP类顶部以保护它们免受直接访问 - 直接布尔检查:
defined('BASE_DIR')||die();
Run Code Online (Sandbox Code Playgroud)
您学习减少使用空间的最有价值的PHP技巧是什么?
更新:似乎有一些关于压缩代码不可读的问题.我同意,不要正常写这样的代码.但是,我正在尝试将代码压缩到非常小的花絮中以获得乐趣,我想知道将函数压缩成几十个字符所需的所有选项.
下次请回答这个问题,不要猜测我对最佳实践的无知.
php ×3
6nf ×1
benchmarking ×1
captcha ×1
css ×1
date ×1
foreign-keys ×1
hash ×1
html ×1
javascript ×1
key-value ×1
methods ×1
perl ×1
postgresql ×1
python ×1
rainbowtable ×1
ruby ×1
security ×1
sql ×1
variables ×1
vote ×1