小编bti*_*lly的帖子

"追随者"和"追随者"的数据库设计?

亲爱的数据库专家/程序员:

我有一个带有用户信息的mysql表,例如

id      user_id         name etc.
1       userA            
2       userB   
3       userC
..      ..
..      ..
Run Code Online (Sandbox Code Playgroud)

我想创建一个像'跟随'其他用户的功​​能,如twitter.userA可以关注userB,或者userB可以关注userA,或者两者都可以互相关注.为此,我应该创建1个表,让我们说追随者

id      user_id     follower_id
1           userA       userB
2           userC       userA
3           userA       userC
4           userB       userC
5           userX       userA
Run Code Online (Sandbox Code Playgroud)

现在我想找到谁跟随userA.我是这样的:从追随者中选择*,其中user_id = userA这将选择userB和userC.多数民众赞成我所需要的.

现在我想找到,userA正在关注哪些人(例如在上表中,userA跟随userC和userX.然后我应该从follower_id = userA的关注者那里运行类似Select*的东西.

我的问题是,这个数据库设计是否适合这个问题(考虑到数据库冗余和优化?)或者可以采用比这更好的方法?谢谢.

sql database

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

(Un)根据图案折叠纸张并给出层的顺序

上个星期五,在法国节目比赛中,我们得到了纸张折叠问题,如下:

  • 给定一张方纸和一个折叠图案,写一个函数"折叠(图案)",它将给出图纸的累积折叠(一半)所产生的图层顺序."

这可能不是很清楚,所以让我解释一下(方便一张纸可能有助于理解,如果你愿意走那么远来帮助我:)).

假设我们有一张正方形纸,我们绘制一个N*N网格,然后对其所有内部正方形进行编号.给定一个"LTRB"模式,我们将这张纸垂直折叠成两半,并将左边的部分放在右边.然后,我们将水平折叠并将顶部放在底部.然后,我们将它再次垂直折叠并将右侧部分放在左侧部分上.最后,我们将水平折叠并将底部放在顶部.这给我们留下了一张纸,大小为一平方和N ^ 2层.预期答案是每个原始正方形的结果顺序.

例如,如果我们在一张方形纸上绘制一个2*2网格,然后将每个内部正方形从1到4(从左上到右下,水平)编号,并给出模式"LT",我们就会有发生这种情况:

fold("LT"):

 1 | 2   L  1,2  T
---|--- ==> --- ==> 2,1,3,4
 3 | 4      3,4
Run Code Online (Sandbox Code Playgroud)

并使用"RB"模式,例如:

fold("RB"): 

 1 | 2   R  2,1  B
---|--- ==> --- ==> 3,4,2,1
 3 | 4      4,3
Run Code Online (Sandbox Code Playgroud)

正如您可能已经猜到的那样,它基本上归结为N*N矩阵的递归变换.这是最简单的部分,这是我的解决方案:

http://ideone.com/QaXGq

现在是有趣的部分.

  • 编写一个函数展开(order),对于给定的结果层排序,它将给出产生这种排序的模式.请注意展开(折叠("LRTB"))=>"LRTB"

然后我的大脑停止工作了一段时间,我没有时间(总共4小时还剩2小时)来提出足够快的解决方案.

我最初的想法是:

  1. 试着暴力吧.因为我们知道输入的长度是N ^ 2,所以我们可以创建一个初始矩阵并尝试所有可能的折叠,直到我们达到与输入相同的顺序.O(4 ^ N)复杂性,不可行.

  2. 蛮力逆转.从输入开始,尝试所有展开的可能性,直到我们达到正确的初始状态.好一点,但仍然太慢.

  3. ???

有人有想法吗?

algorithm math functional-programming scala

11
推荐指数
1
解决办法
1728
查看次数

打印树的每个叶子路径而不递归

如何在不使用递归的情况下打印树的每个叶子路径.

它是一棵树,而不是二叉树

struct node {
    int data
    std::vector<node*> children;
}
Run Code Online (Sandbox Code Playgroud)

打印从根到叶的所有路径,即以下是树

  • r:是根节点
  • d,m,n是r的孩子
  • x,y,z是儿童
  • 米没有孩子
  • o,p是n的孩子
-------------root
------d         m          n
---x  y  z              o  p

结果应该是:

root-d-x
root-d-y
root-d-z
root-m
root-n-o
root-n-p

我尝试使用非递归方式但失败了.

algorithm

7
推荐指数
3
解决办法
8379
查看次数

我如何使用BigQuery补丁?

在BigQuery API文档中,有一个名为patch的方法.我希望我可以用它来改变现有表的模式.不幸的是,bq不支持它.但根据他们的网站,您可以访问https://developers.google.com/bigquery/docs/reference/v2/tables/patch.但是,当我尝试它时,发送以下请求:

PATCH https://www.googleapis.com/bigquery/v2/projects/(my project id)/datasets/tmp_bt/tables/change_cols?key={YOUR_API_KEY}

Content-Type:  application/json
Authorization:  Bearer (removed)
X-JavaScript-User-Agent:  Google APIs Explorer

{
 "schema": {
  "fields": [
   {
   },
   {
   },
   {
    "mode": "nullable",
    "name": "gotchahere",
    "type": "string"
   }
  ]
 }
}
Run Code Online (Sandbox Code Playgroud)

(我不知道空元素来自哪里,并且编辑器太难以用来粘贴我现有的表定义.我注意到它缺少必需的元素,比如我的项目ID,我希望它包括在内,因为它们在形式中被要求)然后我得到答复:

cache-control:  private, max-age=0
content-encoding:  gzip
content-length:  122
content-type:  application/json; charset=UTF-8
date:  Thu, 13 Jun 2013 22:22:09 GMT
expires:  Thu, 13 Jun 2013 22:22:09 GMT
server:  GSE

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error"
   }
  ],
  "code": …
Run Code Online (Sandbox Code Playgroud)

google-bigquery

6
推荐指数
1
解决办法
3383
查看次数

等效的分布式键/值存储的ORM?

我正在评估如何使用分布式键/值存储为后端实现某些功能.我希望在键/值的顶部有一个支持对象模型的层,它与我从对象关系映射器获得的类似.

任何人都可以指出其他人这样做的例子吗?我主要是在寻找设计思路,但是如果我遇到任何我喜欢的东西,我可能只是使用它而不是自己编写.我可能最终会在Riak的顶层实施Perl,但这些决定并非最终决定.

orm nosql riak

5
推荐指数
1
解决办法
571
查看次数

你如何在crontab中取消MAILTO?

正如crontab的文档所解释的那样,如果MAILTO未设置,则输出将转到cron的所有者,如果MAILTO已设置且不为空,则表示邮件应该去哪里,如果设置为空,则不设置邮件.

有没有办法MAILTO在cron设置为某些东西之后取消设置环境变量?我已经尝试了明显的unset MAILTOMAILTO=,但crontab -e不接受这些.

我有一个解决方法(确保我想要的所有默认邮件行为都在原始版本之前).但是我正在编写一个脚本来编写cron作业,能够设置/取消设置MAILTO而不必重新排序命令会很好.

如果重要的话,这将在Vixie cron下的Linux系统上运行.

编辑:澄清.我希望工作要么邮寄给所有者,要么邮寄给一个名为的用户MAILTO.我不希望MAILTO=''导致工作被邮寄到任何人的行为完全没有.

linux cron crontab

5
推荐指数
1
解决办法
1627
查看次数

这个承诺有什么问题?

作为练习,我试图将https://developers.google.com/sheets/api/quickstart/nodejs从回调样式转换为承诺样式,然后使用util.promisify.

一切顺利,直到最终功能。原文是:

function listMajors(auth) {
  const sheets = google.sheets({version: 'v4', auth});
  sheets.spreadsheets.values.get({
    spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
    range: 'Class Data!A2:E',
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    const rows = res.data.values;
    if (rows.length) {
      console.log('Name, Major:');
      // Print columns A and E, which correspond to indices 0 and 4.
      rows.map((row) => {
        console.log(`${row[0]}, ${row[4]}`);
      });
    } else {
      console.log('No data found.');
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

承诺的版本是:

function listMajors(auth) {
  const sheets …
Run Code Online (Sandbox Code Playgroud)

google-sheets node.js google-sheets-api

3
推荐指数
1
解决办法
372
查看次数