我正在使用谷歌应用引擎(GAE)进行Java.我正在努力设计一个能够发挥大表优势和劣势的数据模型,这些是之前的两个相关帖子:
我暂时决定在一个完全规范化的主干上,将非规范化属性添加到实体中,这样大多数客户端请求只能用一个查询来处理.
我认为完全规范化的主干将:
而非规范化数据将:
我观看了一个app引擎视频,描述了一种被称为"扇出"的技术.我们的想法是快速写入规范化数据,然后使用任务队列完成幕后的非规范化,而无需客户端等待.我已将视频添加到此处以供参考,但它只需一小时,而且无需观看它就能理解这个问题:http: //code.google.com/events/io/2010/sessions/high-throughput -data-管道,appengine.html
如果我使用这种"扇出"技术,每次客户端修改一些数据时,应用程序将在一次快速写入中更新规范化模型,然后将非规范化指令发送到任务队列,这样客户端就不必等待他们也完成了.
使用任务队列更新数据的非规范化版本的问题在于,在任务队列完成对该数据的非规范化之前,客户端可以对刚刚修改的数据发出读取请求.这将为客户端提供过时的数据,这些数据与他们最近的请求混淆客户端并使应用程序显得有问题.
作为补救措施,我建议通过URLFetch异步调用应用程序中的其他URL来并行扇出非规范化操作:http://code.google.com/appengine/docs/java/urlfetch/ 应用程序将等到所有在响应客户端请求之前已完成异步调用.
例如,如果我有一个"约会"实体和一个"客户"实体.每个约会将包括其预定的客户信息的非规范化副本.如果客户更改了他们的名字,那么该应用程序将进行30次异步调用; 每个受影响的约会资源一个,以便更改每个客户的名字副本.
从理论上讲,这可以全部并行完成.所有这些信息都可以在大约花费1或2次写入数据存储区所需的时间内更新.在非规范化完成后,可以对客户端做出及时响应,消除客户端暴露于不一致数据的可能性.
我看到的最大的潜在问题是,应用程序在任何时候都不能有超过10个异步请求调用(此处记录):http://code.google.com/appengine/docs/java/urlfetch/overview .html).
我提出的补救措施是将非规范化指令发送到另一个资源,该资源递归地将指令拆分成相等大小的较小块,用较小的块作为参数调用自身,直到每个块中的指令数足够小以便完全执行.例如,如果具有30个关联约会的客户更改了其名字的拼写.我将使用指令更新所有30个约会来调用非规范化资源.然后,它将这些指令分成10组3条指令,并使用每组3条指令向其自己的URL发出10个异步请求.一旦指令集小于10,资源就会根据每条指令直接发出异步请求.
我对这种方法的担忧是:
我真的很感激这种方法的一些意见.
java google-app-engine database-design bigtable denormalization
我有一系列的数字,如1-100.我有一个包含所有数据的集合,或者该范围内的随机数字子集,例如:
Run Code Online (Sandbox Code Playgroud)s = set([1,2,3,35,67,87,95])
什么是获得1-100范围内的所有数字的好方法?
我正在使用javascript,并希望获取我拥有的URL字符串,并将其分解为其组件,如主机,路径和查询参数.
我需要这样做才能获得一个查询参数,它本身就是一个URL,因此在原始URL字符串中编码.
我觉得在Javascript中应该有一个简单的方法来做到这一点.也许看起来像这样:
var what_I_Want = url("http://www.domain.com?queryArg1=somequeryargument").getQueryArgumentValue("queryArg1");
Run Code Online (Sandbox Code Playgroud) 刚写了一些讨厌的代码,它们迭代在Python dict
或者list
Python中.我觉得这不是最好的方法.
问题是,为了迭代dict,这是惯例:
for key in dict_object:
dict_object[key] = 1
Run Code Online (Sandbox Code Playgroud)
但是,如果在列表上执行相同的操作,则按键修改对象属性不起作用:
# Throws an error because the value of key is the property value, not
# the list index:
for key in list_object:
list_object[key] = 1
Run Code Online (Sandbox Code Playgroud)
我解决这个问题的方法是编写这个讨厌的代码:
if isinstance(obj, dict):
for key in obj:
do_loop_contents(obj, key)
elif isinstance(obj, list):
for i in xrange(0, len(obj)):
do_loop_contents(obj, i)
def do_loop_contents(obj, key):
obj[key] = 1
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
谢谢!
跟进我之前的问题:
为API客户端提供1,000,000个数据库结果的好方法是什么?
我们目前正在使用PostgreSQL.一些建议的方法:
我没有想到的是愚蠢的简单和比任何这些选项更好的方式?
Cassandra中的主键是否可以包含集合列?
例:
CREATE TABLE person (
first_name text,
emails set<text>,
description text
PRIMARY KEY (first_name, emails)
);
Run Code Online (Sandbox Code Playgroud) 我正在构建一个RESTful资源集合,其工作方式如下:(我将以"people"为例):
GET /people/{key} - returns a person object (JSON)
GET /people?first_name=Bob - returns a list of person objects who's "first_name" is "Bob" (JSON)
PUT /people/{key} - expects a person object in the payload (JSON), updates the person in the datastore with the {key} found in the URL parameter to match the payload. If it is a new object, the client specifies the key of the new object.
到目前为止,我对设计感到非常满意(尽管欢迎任何投入/批评).
我也希望能够列出一个人的列表,但是我对我的设计的RESTful性并不自信.这就是我的想法:
PUT /people - expects a list of objects in JSON form …
试图做出一些改变.我曾经git add
使用通配符添加了我可能创建的任何新的javascript文件*.js
.然后我提交了更改并推送到github:
git add *.js git commit -m "stuff" git push github master
当我检查github时,我编辑的所有文件都是空白的.他们在那里,只是空着.
然后我再次尝试提交,但GIT说一切都是最新的.
然后我回过头来注意到,在我做完之后git commit -m "stuff"
,GIT显示了一条消息,说我的一些".js"文件没有上演,即使我刚刚使用通配符添加它们:git add *.js
.这是我尝试提交时显示的消息.
# On branch master # Changes not staged for commit: # (use "git add/rm ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: src/static/directory1/js/module1/file1.js # modified: src/static/directory1/js/module1/file2.js # modified: src/static/directory1/js/module2/file1.js
为了解决这个问题,我必须在执行git add
以下操作时查看几个目录:
git add src/static/directory1/*.js
这看起来很有效,因为在我再次提交之后文件就在那里然后推送到github: …
为Javascript寻找一个好的IP地址解析器.
理想情况下,它可以将IP地址作为字符串,然后返回包含IP地址的所有部分的对象,包括端口.
谢谢!
我遇到MessageDigest在不同计算机上返回不同哈希值的问题.
一台计算机在Windows Vista上运行32位Java,另一台在Mac OS上运行64位Java.我不确定是不是因为MessageDigest是依赖于机器的,或者我需要在某处明确指定字符编码,或者可能是其他东西.这是代码:
public static boolean authenticate(String salt, String encryptedPassword,
char[] plainTextPassword ) throws NoSuchAlgorithmException {
// do I need to explcitly specify character encoding here? -->
String saltPlusPlainTextPassword = salt + new String(plainTextPassword);
MessageDigest sha = MessageDigest.getInstance("SHA-512");
// is this machine dependent? -->
sha.update(saltPlusPlainTextPassword.getBytes());
byte[] hashedByteArray = sha.digest();
// or... perhaps theres a translation problem here? -->
String hashed = new String(hashedByteArray);
return hashed.equals(encryptedPassword);
}
Run Code Online (Sandbox Code Playgroud)
这些代码应该在这两台不同的机器上执 如果它与我编写它的方式是机器相关的,那么还有另一种方法来散列这些更便携的密码吗?谢谢!
这是我用来生成盐的代码:
public static String getSalt() {
int size = 16; …
Run Code Online (Sandbox Code Playgroud) java ×2
javascript ×2
python ×2
api ×1
bigtable ×1
cassandra ×1
dictionary ×1
git ×1
github ×1
hash ×1
ip-address ×1
list ×1
loops ×1
pagination ×1
parsing ×1
postgresql ×1
range ×1
rest ×1
set ×1
url ×1
url-parsing ×1