我在MySQL中有两个表。Table Person具有以下列:
水果列可以包含null或字符串数组,如('apple','orange','banana')或('草莓')等。第二个表是水果表,有以下三列:
那么,我应该如何设计第一个表中的水果列,以便它可以容纳从第二个表中的水果名称列获取值的字符串数组?既然MySQL中没有数组数据类型,我应该怎么做?
MySQL 5.7现在提供了JSON数据类型。这种新的数据类型提供了一种方便的存储复杂数据的新方法:列表、字典等。
也就是说,数组不能很好地映射数据库,这就是为什么对象关系映射可能非常复杂。历史上,人们通过创建一个描述列表/数组的表并将每个值添加为自己的记录来在MySQL中存储列表/数组。该表可能只有2或3列,也可能包含更多列。您如何存储此类数据实际上取决于数据的特征。
例如,列表是否包含静态或动态数量的条目?这份名单会一直保持在很小的范围内,还是会增长到数百万条记录?这张桌子上有很多书吗?写了很多?有很多更新?这些都是在决定如何存储数据集合时需要考虑的因素。
此外,键/值数据存储、文档存储(如Cassandra、MongoDB、Redis等)也提供了一个很好的解决方案。只需知道数据实际存储在哪里(如果存储在磁盘或内存中)。并非所有数据都需要位于同一数据库中。有些数据无法很好地映射到关系数据库,您可能有理由将其存储在其他位置,或者您可能希望使用内存中的键:值数据库作为存储在磁盘上某处的数据的热缓存,或者作为会话等内容的临时存储。
SQL中没有数组的原因是因为大多数人并不真正需要它。关系数据库(SQL就是这样)使用关系工作,大多数情况下,最好是将表的一行分配给每个“信息位”。例如,您可能会认为“我想要这里的东西列表”,而是创建一个新表,将一个表中的行与另一个表中的行链接起来。[1] 这样,就可以表示M:N关系。另一个优点是,这些链接不会使包含链接项的行混乱。数据库可以索引这些行。数组通常没有索引。
如果不需要关系数据库,可以使用键值存储等。
请阅读有关数据库规范化的内容。黄金规则是“[每个]非键[属性]必须提供关于键的事实,整个键,除了键什么都不提供。”数组做得太多了。它有多个事实,并且它存储顺序(与关系本身无关)。而且性能很差(见上文)。
想象一下,你有一个人表,你有一个人打电话的表。现在你可以让每个人行都有一个他的电话列表。但是每个人都与许多其他事物有许多其他关系。这是否意味着我的人表应该包含一个数组,用于他连接到的每一件事物?不,这不是人本身的属性。
[1] :如果链接表只有两列(每个表的主键),则可以!但是,如果关系本身具有其他属性,则应在此表中以列的形式表示这些属性。
正确的方法是使用多个表并在查询中连接它们。
例如:
CREATE TABLE person (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);
CREATE TABLE fruits (
`fruit_name` VARCHAR(20) NOT NULL PRIMARY KEY,
`color` VARCHAR(20),
`price` INT
);
CREATE TABLE person_fruit (
`person_id` INT NOT NULL,
`fruit_name` VARCHAR(20) NOT NULL,
PRIMARY KEY(`person_id`, `fruit_name`)
);
person_fruit
表包含一个人关联的每个水果的一行,并有效地将人
和水果
表链接在一起,即E.
1 | "banana"
1 | "apple"
1 | "orange"
2 | "straberry"
2 | "banana"
2 | "apple"
当你想找回一个人和他们所有的水果时,你可以这样做:
SELECT p.*, f.*
FROM person p
INNER JOIN person_fruit pf
ON pf.person_id = p.id
INNER JOIN fruits f
ON f.fruit_name = pf.fruit_name
问题内容: 我在MySQL中有两个表。表人具有以下列: 该列可以包含null或字符串数组,例如(’apple’,’orange’,’banana’)或(’strawberry’)等。第二个表是Table Fruit,具有以下三列: 那么,我应该如何设计第一个表中的列,以便它可以容纳从第二个表中的列获取值的字符串数组?由于MySQL中没有数组数据类型,该怎么办? 问题答案: 正确的方法是在查询中
问题内容: 我尝试将DECIMAL与(2,2)一起使用,但不允许我使用。 我只想存储一个数字,例如7.50或10.50。我需要将两个数字都保留在小数点后,但是当我刷新数据库时,它将值重置为0.99。有什么建议么? 问题答案: 声明的第一位数字是 总数 。您可能想要使用。这允许小数点前最多两位数,小数点后两位数。 文档:https : //dev.mysql.com/doc/refman/5.7/e
问题内容: 这星期我们在办公室进行了一场健康的辩论。我们正在创建一个Db来存储代理信息,在大多数情况下,除了应该如何存储IP之外,我们还制定了模式。一个阵营想要使用4个smallint,每个八位位组一个,另一个希望使用1个大int INET_ATON。 这些表将非常庞大,因此性能至关重要。我处于中间位置,因为我通常在世界中使用MS SQL和4个小整数。我对这种类型的IP存储量没有足够的经验。 我们
问题内容: 我有一个具有数据类型joda.money属性的类。如何将这个属性映射到mysql中。 我的课是: @Table(name =“ products”)公共类Product(){@Column(name =“ name”)字符串名称;@Column(name =“ money”)金钱金钱;} 我正在使用Spring Hibernate 谁能说出如何将此模型存储到mysql中? 问题答案:
问题内容: 如何在免费版本的MySQL中存储Unicode? 在SQL Server中似乎没有类型。MySQL不支持Unicode吗?我尝试使用,但是那也不起作用。 问题答案: 您需要为表选择一个 字符集。然后,文本和备注字段将自动存储在UTF-8中。MySQL 6中提供了对UTF-16的支持。
问题内容: 我得到了一些“ 锻炼程序” 内容,这些内容将按顺序显示给用户。下面显示了最简单形式的示例。 通常,这些表至少要包含100行/练习,并且大约有300个表(针对不同标准的不同练习)。我们没有任何前端,可以直接使用 _dbForge Studio_数据库编辑器更新数据库。 以前的开发人员已经设计了表格,以便唯一ID列也可用作序列号。它也构成url的一部分。例如xxx / exercise /