许多商店的许多订户

时间:2014-04-27 16:15:26

标签: java sql sqlite ormlite

我在Shop表中有很多商店,而DB中的User表中有很多用户。 用户可以订阅任何商店。

如何为此任务创建表格?带有商店名称和第二列的第一列 - 以逗号分隔的用户ID的字符串?

5 个答案:

答案 0 :(得分:1)

这通常被称为多对多关系。在标准关系数据库中,这通常由带有user_idshop_id的表格表示,每个用户一行 - >店铺关系。

您永远不会想要使用逗号分隔的字符串来表示数据库中的多个项目,因为这会使查询效率非常低。例如,要查找用户a订阅的商店,您必须解析表的每一行,以查找哪个逗号分隔值包含a

答案 1 :(得分:1)

这是一种多对多的关系。你需要第三张桌子,比如叫Subscription。这些字段将是两个外键,一个引用User表的主键,另一个引用Shop表的主键。

答案 2 :(得分:1)

您可以创建一个表格,其中每一行代表一个订阅(即一对(用户,商店))。 因此,您将在表中拥有(至少)两列:商店的ID和用户的ID。 假设用户只能订购一次商店,那么该对(user_id,shop_id)应该是表的主键(如果您需要为表定义代理键,您可以为该对添加唯一约束) (USER_ID,shop_id))。 如果您有许多数据并且需要快速获取用户订阅的所有商店,则应该向user_id列添加索引。 另一方面,如果您需要快速获得订阅商店的所有用户,您应该在shop_id列中添加索引。

答案 3 :(得分:0)

我相信用户可以订阅多个商店,一个商店可以有多个用户订阅它。在这种情况下,最好使用来自商店表的shop_id的映射表和来自用户表的user_id。 (保持外键约束)。对于每个订阅,此表将保留一个条目,因此不需要以逗号分隔的字符串。

答案 4 :(得分:0)

听起来你在数据库中有一个经典的情况,标志着一个"平面文件"数据库和"关系数据库"像MySQL,Oracle或MS的SQL Server。类似的情况是作者和书籍。作者可以拥有多本书,有些书籍可以有多位作者。

一个简单的逗号分隔数据库是一个平面文件,每个关系需要一个单独的行。例如,

ShopA,UserA ShopB,UserA ShopA,UserB ShopB,UserB

在关系数据库中,您可以在两个单独的表中隔离用户表和商店表,并形成第三个表,描述关系的关系表,从而删除用户和商店表中的冗余,

ShopTable ShopA,SA ShopB,SB

用户表 UserA,UA UserB,UB

ShopUserRelationTable SA,UA SA,UB SB,UA SB,UB

当您需要显示关系的记录时,应用SQL语言来创建显示此关系的记录序列。

删除表中冗余的基本问题是促进关系数据库软件开发的动力。

有时会发生一个表格很复杂,足以包含多少对多的表格。像这样的关系和SQL可以进一步应用于分析和创建反映这些关系的记录。这样的表也可以作为其他表的多对多关系表。