为对象存储选择 KEY

Posted

技术标签:

【中文标题】为对象存储选择 KEY【英文标题】:Choosing a KEY for an object store 【发布时间】:2014-06-17 18:37:46 【问题描述】:

哦,这可能是一个相对简单的问题,但我无法弄清楚(通过测试代码和谷歌搜索)。

我启用了简单登录并启用了电子邮件/密码,因此当他们登录时,使用的电子邮件将被转换为 md5_hash。

我创建了一个“用户”对象存储,目前看起来像这样:

users
  |____ Bob
         |__ md5_hash: 8120jf283
         |__ username: Bob
  |____ Alice
         |__ md5_hash: 2938njv29
         |__ username: Alice
  |____ Chris
         |__ md5_hash: 230948mv2
         |__ username: Chris

我的问题是:如何更改“模式”,以便通过用户的 md5_hash 而不是用户名存储用户?您可以在上面看到它存储 Bob、Alice 和 Chris 的用户。如果我可以将它们存储在他们的 md5_hash 中,这样对我来说会更好:

Users
  |___ 02938492
    |__ md5_hash: 02938492
    |__ username: Bob

这是我用来创建用户并将其保存到 Firebase 数据库中的代码:

var ref = new Firebase(FIREBASE_URL + 'users');
var users = $firebase(ref);

function(authUser, username) 
    users[username] = 
        md5_hash: authUser.md5_hash,
        username: username,
        $priority: authUser.uid
    ;
    users.$save(username).then(function() 
        *do something here in callback*
    );

我尝试了 2 种不同的方法,但均无效。我尝试使用

users[authUser.md5_hash] = ...; 

我也试过了

users.$save(authUser.md5_hash)

这些都不起作用。没有任何内容保存到 Firebase 数据库中。这让我感到困惑,因为我几乎 100% 确定它是决定如何将密钥保存到 Firebase 的那两个部分之一,但它什么也没做。

最终,我要做的是能够在一个人登录后“获取”用户名值。我将以一种“欢迎 Bob”的方式在导航栏上显示他们的用户名。但是,当用户登录时,他们的 md5_hash 和他们的用户名之间还没有任何关联。我必须能够从“users”表中获取用户名,并且因为我不知道他们的用户名,并且“users”表当前由他们的用户名索引或键控,所以我无法获取它.. .

还有一个快速设计问题(如果你有时间的话):

另外,这与上述问题无关,但有些相关。只是一个关于设计我的火力基地“模式”的快速问题。如果您有时间,最好能快速阅读以下内容:

正如我之前提到的,我正在使用带有电子邮件/密码的简单登录。当用户登录时,我可以访问他们电子邮件的 md5_hash。因此,为了将其他用户信息与该登录名相关联,我创建了“用户表”。我正在尝试使用 md5_hash 将登录/身份验证与所述表连接起来(因为这对每个用户都是唯一的),然后在其中存储其他有用的用户数据,例如用户名、年龄等。

这就是设计他们的 firebase 架构的方式吗?我习惯于在 SQL 中使用某种 GUID 或索引,我认为由于 md5_hash 是唯一的,我可以类似地使用它来“索引”我的 firebase users 表。就是不知道以后这样做会不会出问题。

非常感谢您的宝贵时间。对此的任何帮助或建议将不胜感激! :)

【问题讨论】:

FWIW,哈希不是唯一的...... 啊……我明白了,我不知道。我认为唯一电子邮件的哈希值会创建一个唯一的哈希值。当用户登录时,它还提供了一个 id 和 uid,我想我应该使用其中一个来代替?尽管关于如何使用 id 或 uid 而不是用户名作为键,我仍然有同样的问题。不过,感谢您对哈希的提醒! :) 【参考方案1】:

使用简单登录,创建用户时具有唯一 ID:

var fbRef = new Firebase(URL);
var auth = new FirebaseSimpleLogin(fbRef);
auth.createUser(email, password, function(error, user) 
  if( error ) throw error;
  console.log('unique id', user.uid);
);

您可以将其用作您的唯一标识符。如果这还不够,您可以从 Firebase push() 命令获取唯一 ID:

var fbRef = new Firebase(URL);
var uniqueId = fbRef.push().name();
fbRef.child('users/'+fbRef).set(userData);

// or even shorter
var uniqueId = fbRef.push(userData).name();

使用 AngularFire,您可以简单地调用 $add 而不是 $save 来创建唯一 ID:

var users = $firebase(fbRef);
users.$add( userData ).then(function(ref) 
   console.log('unique id', ref.name());
);

【讨论】:

以上是关于为对象存储选择 KEY的主要内容,如果未能解决你的问题,请参考以下文章

data([key],[value])

localstorage存储对象

KEY 在 IBM Cloud cli 的云对象存储插件中是啥意思?

jquery_核心_

小白使用阿里云的oss实现文件云存储

sessionStoragelocalStorage 存储及如何存储数组与对象