我在Shop表中有很多商店,而DB中的User表中有很多用户。 用户可以订阅任何商店。
如何为此任务创建表格?带有商店名称和第二列的第一列 - 以逗号分隔的用户ID的字符串?
答案 0 :(得分:1)
这通常被称为多对多关系。在标准关系数据库中,这通常由带有user_id
和shop_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可以进一步应用于分析和创建反映这些关系的记录。这样的表也可以作为其他表的多对多关系表。