我刚刚开始探索SQL数据库,但是我遇到了如何在现有表中存储'复合'结构的问题(如果这是正确的方法)。例如,假设我有一个包含用户行的数据库表,其中每个用户都有一个唯一ID ,一个哈希密码,一个电子邮件地址,电话号码等
足够简单。但是,我希望允许每个用户创建和存储帖子数组。每个帖子都有帖子ID ,内容,日期以及各种其他元数据。如果这是C ++,我可能会有一个Posts数组/向量作为User类的成员,而不是我在某处存储User对象的数组/向量。是否可以在SQL中的表中存储表,以便每个用户都可以访问他们自己的帖子表?
或者,使用一些常见元素(如用户ID或用户名)创建两个单独的表(用户表和发布表)会更好吗? )从posts表中检索用户特定的数据,反之亦然?
我正在尝试了解如何实现一个复杂的数据库,该数据库可能能够管理大量用户,使用特定于用户的数据集,如帖子,消息等。那么这可能是一个很好的方法前进?
答案 0 :(得分:2)
正如您已经提到的,在关系数据模型中,您可以定义两个表,如下所示:
表1:用户
user_id user_name
----------- ------------------
1 'Tom'
2 'John'
表2:帖子
post_id user_id content post_date
-------- ---------- ------------------- ---------------------
1 1 'Hello, I am Tom.' 2014-04-02 14:14
2 1 'good bye' 2014-04-02 20:10
3 2 'I am John' 2014-04-02 22:22
您可以在此处阅读介绍性文章:
Relational_model: http://en.wikipedia.org/wiki/Relational_model
希望这有帮助。
答案 1 :(得分:2)
您不在表格中存储表格。您可以将数据存储在多个表中,并为一个表分配主键,为另一个表分配外键。
阅读主键,外键和关系模型。
清除这些概念后,请阅读数据库规范化
答案 2 :(得分:1)
您不会在表格中存储表格。正如你的第三段所暗示的那样,策略是使用一些共同的关键来关联"表格相互排列。
"唯一ID"你描述的通常被称为"主键"。您可能拥有一个具有主键的用户表,每次添加记录时,主键都会自动递增。您可以使用一个函数,以便在插入之后,您可以确定刚刚添加的记录的主键是什么,以便您可以将记录添加到引用users表主键的其他表中。
您可能应该阅读Database normalization relational model Normal Forms,特别是{{3}}之间的差异。
关于选择要将帖子与用户关联的字段,我建议您不要使用用户名,而是使用一些不可见的内部参考用户。虽然您的应用程序现在可能不允许,但如果您希望为用户提供更改其用户名的机会,则根据用户输入将内部数据库结构绑定到某些内容只会导致将来出现问题。