基本上,我的问题是 - 我有一个价格列表,其中一些是历史的(即我希望能够搜索产品X在3月11日为0.99美元,4月1日为1.99美元等).存储此信息的最佳方法是什么?
我假设我可能有一个Product表,它有一个价格表的外键.我最初认为存储当前价格可能是最好的选择,但我认为我希望能够存储历史价格数据,因此更好的路线是如何在价目表中存储如下表格:
CREATE TABLE prices (
id BIGINT auto_increment not null,
primary key (id),
price DECIMAL(4,2) not null,
effectiveStartDate DATETIME NOT NULL,
effectiveEndDate DATETIME
);
Run Code Online (Sandbox Code Playgroud)
我在这里有点不知所措.我希望能够有效地搜索产品,并了解该产品的价格如何随时间而变化.如何有效地将一组这些价格与产品相关联?我想我要问的是,'为了能够为跨越特定日期的查询提供有效搜索,最好的方法是将其编入索引?'
我的问题与 Postgres 的工作原理有关:
我有一张桌子:
CREATE TABLE A (
id SERIAL,
name VARCHAR(32),
type VARCHAR(32) NOT NULL,
priority SMALLINT NOT NULL,
x SMALLINT NOT NULL,
y SMALLINT NOT NULL,
start timestamp with time zone,
end timestamp with time zone,
state Astate NOT NULL,
other_table_id1 bigint REFERENCES W,
other_table_id2 bigint NOT NULL REFERENCES S,
PRIMARY KEY(id)
); Run Code Online (Sandbox Code Playgroud)
在 other_table_id1、state 和 other_table_id2 上附加索引。
该表非常大,并且在列上看到了很多更新:other_table_id1、state。开始和结束列的一些更新,但其余的都是不可变的。(Astate 是列状态的枚举类型。)
我想知道将两个最常更新的列拆分到一个单独的表中是否有意义。我希望获得的是性能,因为当我只是查找该信息时,或者减少更新的权重,因为(也许?)读取和写入较短的行成本较低。但是,当(偶尔)需要一次性获得特定项目的所有数据时,我需要将其与连接成本进行权衡。
有一次,我的印象是每一列都是单独存储的。但是后来,当我在某处读到减少表格一侧列的宽度确实会对使用另一列查找数据时的性能产生积极影响时,我修改了我的想法(因为该行存储在一起,因此总行长度将更短)。所以我现在的印象是一行的所有数据都物理存储在磁盘上;所以提议的表格拆分听起来会很有帮助。当我当前写入 4 个字节来更新状态时,我是否相信我正在重写实际上从未改变的 64 个字节的文本(名称、类型)?
我对表“规范化”不是很熟悉,也不熟悉 Postgres 的内部结构,所以我正在寻找建议和 esp 最佳实践来估计权衡,而不必先做工作,然后确定这项工作是否值得. 这种变化需要相当多的努力来重写已经高度优化的查询,所以我宁愿深入了解我可以期待什么结果。谢谢,M。
我正在尝试使用MongoDB作为数据库创建一个事件平台.我希望Events和之间有多对多的关系Users.问题是,我希望在关系中有属性(例如,Users可以确认或未确认具体Event).我意识到这将非常适合RDBMS,但我使用MongoDB的原因是我在其他地方利用它,我宁愿继续使用它.
我希望每个人Event都能嵌入许多Guests属于的人Users.这样,我可以看到哪些用户快速参加了一个事件并且只有一个查询.不过,我也想看看这Events一个User迅速出席,所以我想每一个User有数组EventIDS.
这是一个代码摘要.
# user of the application
class User
has_many :events
end
# event that users can choose to attend
class Event
embeds_many :guests
has_many :users, :through => :guests # Won't work
end
# guests for an event
class Guest
field :confirmed?, type: Boolean
embedded_in :event
belongs_to :user
end
# Ideal use pattern
u = User.create
e …Run Code Online (Sandbox Code Playgroud) 是否有任何推荐/既定的方法来解释 SQL 查询的工作原理?
我们的项目中有相当多的复杂查询,我们需要使用 UML 或任何其他建模语言来记录它。
请注意,我不是在询问数据建模。它更多的是记录 SQL 逻辑,即表如何连接、条件如何影响结果、连接等。
所以,最后:
我通过 Datastax 驱动程序在 Cassandra 中存储一些数据,并且需要存储无符号 16 位和 32 位整数。对于无符号 16 位整数,我可以轻松地将它们存储为有符号 32 位整数,并根据需要进行转换。然而,对于无符号 64 位整数,我不知所措。我可以将它们存储为字符串并解析它们,也可以将它们存储为字节数组。我可以将它们存储为 64 位有符号整数,并执行与 64 位无符号整数之间的转换所需的位操作。
推荐的方式是什么?
我正在尝试为消息框应用程序找到最佳的数据模型。该消息按以下顺序显示:首先出现 \xe2\x80\x98unread\xe2\x80\x99,然后当用户滚动时,将出现 \xe2\x80\x98read\xe2\x80\x99 消息。在这两个类别中,我想按到达时间对消息进行排序。类似于 Gmail 中的优先收件箱。
\n\n我想使用的第一个模式是:
\n\nCREATE TABLE inbox \n (userId uuid,\n messageId timeuuid,\n data blob,\n isRead boolean,\n PRIMARY KEY(userId, isRead, messageId))\n WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);\nRun Code Online (Sandbox Code Playgroud)\n\n所以我的数据首先按布尔字段排序,然后按时间排序。现在,我可以轻松地先查看“未读”消息,在它们全部结束后,我将开始阅读“已读”消息。
\n\n问题是我无法更新任何消息状态,因为它是主键的一部分。我可以执行删除然后插入批量操作,它也是同一行。
\n\n另一个解决方案是:
\n\nCREATE TABLE inbox\n (userId uuid,\n messageId timeuuid,\n data blob,\n isRead boolean,\n PRIMARY KEY((userId, isRead), messageId))\n WITH CLUSTERING ORDER BY (messageId DESC)\nRun Code Online (Sandbox Code Playgroud)\n\n每个状态都有一行。我获得了非常轻松的访问权限,但这是否意味着我必须处理交易?读取消息时,我必须从 \xe2\x80\x98unread\xe2\x80\x99 行中删除它,并将其插入到 \xe2\x80\x98read\xe2\x80\x99 行,它们可能位于不同的分区中。
\n\n分区键的另一个版本可以是:
\n\nPRIMARY KEY(userId, messageId)\nRun Code Online (Sandbox Code Playgroud)\n\n然后我会在 isRead 上添加一个二级索引。我的查询将始终针对某个用户而不是一组用户。
\n\n有什么更好的想法吗?或者还有其他的建模想法吗?
\ndata-modeling cql cassandra secondary-indexes clustering-key
我想在追求这种关联之前确保我的方法是正确的.实施听起来太复杂了,所以我认为我的计划肯定有问题.我正在使用结构化(SQL)数据存储,符合rails存储约定.我所拥有的是用户模型,它在模式中有一个电子邮件地址password_digest和名称.
class User < ActiveRecord::Base
has_many :posts
end
Run Code Online (Sandbox Code Playgroud)
我想实现has_many与朋友集合的关联,以便用户可以belong_to用户(作为朋友).我希望能够User.last.friends.last在正确构建和填充后返回User对象.
我相信我可以为这个协会创建一个模型,如:
Class Friend < ActiveRecord::Base
belongs_to :user
belongs_to :friendlies, class: 'User'
end
Class User < ActiveRecord::Base
has_many :posts
has_many :friends
has_many :friendly, class: 'Friend'
end
Run Code Online (Sandbox Code Playgroud)
但我认为这需要我添加一个关于模型和查询使用User.last.friends.last.user 所以我在想的是这是一种has_and_belongs_to_many关系.我可以逃脱以下(或类似的东西):
class User < ActiveRecord::Base
has_and_belongs_to_many :friends, class: 'User'
end
Run Code Online (Sandbox Code Playgroud)
我发现了这个:
class User < ActiveRecord::Base
has_many :user_friendships
has_many :friends, through: :user_friendships
class UserFriendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: …Run Code Online (Sandbox Code Playgroud) 假设我们有可以评论视频的用户,并且我们希望显示带有用户名的视频的所有评论。用户也可以转到他的个人资料页面并更改他的名字。
基于此答案 Cassandra非规范化数据模型中介绍的 Cassandra 数据建模实践,我创建了这样的表:
CREATE TABLE users (
user_id UUID,
first_name TEXT,
last_name TEXT,
PRIMARY KEY ((user_id))
);
CREATE TABLE comments_by_video (
video_id UUID,
added_at TIMESTAMP,
user_id UUID,
comment TEXT,
first_name TEXT,
last_name TEXT,
PRIMARY KEY ((video_id), added_at, user_id)
);
Run Code Online (Sandbox Code Playgroud)
看起来棒极了,我们只需一个查询就可以获得视频评论所需的数据。
现在,让我们考虑这样的用例。
用户创建了大量评论(例如 10 000 条),然后决定更改他的名字。我们应该更新所有评论以更改他的名字吗?有没有办法让它变得高效?
我正在使用Ionic 3,Angular 4和Firebase构建应用程序,我对数据建模非常困惑.有两种方法.
我不确定我应该采取哪种方法.接口将是空体,但将允许可选变量,但类不会.
我只是在寻找数据建模的清晰概念.
我一直在思考Tinder可能如何设置其数据模型-尤其是选择要显示的候选对象的部分(我不是在讨论确定顺序的算法,而是在第一个方法中如何获取所有可能的候选对象。地点)。此过程应仅显示当前用户尚未投票的其他个人资料。因此,我可以想象一下:一张表用于Users(> 40mio条目),另一张用于滑动(每天> 15亿个新条目)。选择候选人时,可以加入两个表(+显然会应用某些其他选择条件,例如位置,年龄范围等),只返回当前用户尚未刷卡的用户。
但是:有规模吗?这两个表都很大-所以我猜您有时会遇到问题,对吗?
此外,我读到Tinder正在使用AWS DynamoDB-而不是关系模型。这使我想起来更加困难...
所以我的问题是:您对Tinder如何做到这一点有想法吗?
data-modeling ×10
cassandra ×3
sql ×3
.net ×1
activerecord ×1
angular ×1
c# ×1
cql ×1
database ×1
e-commerce ×1
mongodb ×1
mongoid ×1
mysql ×1
nosql ×1
postgresql ×1
uml ×1