优化 MySQL 数据存储
Optimized MySQL data store
我想将用户信息存储在table。
第一个例子
这些领域是例如。 "has car"、"has flat"、"has cat"、"has dog"、"has LCD TV"、"has notebook"...
字段的值可以是y/n或y/null(null表示table中的空值)。
上面的字段是随机填充的,例如。
"y"、"null"、"null"、"null"、"y"、"null"
或者
"y"、"n"、"n"、"n"、"y"、"n"
所以只有那些字段包含对我有用的信息,这些字段已填写 "y",因为当我使用查询时,我只想查看那些字段的结果,这些字段仅包含 "y" 值。
这是否有可能,因为显然每条记录的结果都会与其他记录不同?
方案二
我创建了一个 table 来存储用户 ID 和用户的 属性,例如
用户 ID 属性
1 有车
1 有狗
2 有液晶电视
3有平
3 有笔记本
3 有猫
这里没有存储不必要的信息,但DB可以有超过100000行。
我的问题是最好的存储方法是什么。大约 100-120 属性 将用于一个用户。并且将有另一个 table 将连接到原始 table,后者还将包含另外 50 个类似的 属性 (y/null).
我认为第二种解决方案最好,但我对速度有疑问。当然会使用主键,并且会收到更重要的字段(外键)"Unique"。 (听说用unique可以更快收到结果。)
你觉得上面写的怎么样?
提前感谢您的回答。
致以最诚挚的问候&美好的一天,
姿态
哪个更好取决于数据的查询方式以及未来可能发生的变化。 (TL;DR - 第一个解决方案糟透了)。
假设您要运行 查询以找出哪些用户养了一只狗。为了避免查看数据库中的每一行,您需要一个索引 - 这意味着您需要为 table 中的每个字段创建一个索引。
现在考虑当您想要添加一个新的 "has" 时会发生什么。为了使 space 成为新属性,您需要重写 table 中的每一行(这并不严格,因为 MySQL,就像大多数数据库倾向于添加一个一点备用 space,但在某些时候这将被耗尽)。当然,在您应用新架构时,您的 table 将在一段时间内无法使用 - 每次添加新资产时都必须更改架构。
对于您可以在两个模型上 运行 进行的所有可能查询中的一小部分,为每个资产使用单独的列会更快,但对于绝大多数而言,它没有什么不同或更快使用 user/key/value table。执行插入肯定会快很多,因为您只需要更新一个或两个索引。
从我的角度来看,如果我理解正确,这里最好的解决方案是在 table user 之间创建多对多关系(其中包含 user_id 和一些关于用户的信息(如果需要)和第二个 table 让我们称之为 has 它将包含 has_id 和名称(将存储用户有什么狗、电视、猫等)。
要创建多对多关系,您需要第三个 table,称为联结 table,可以将其命名为 user_had 并且包含一对字段 user_id 和 has_id 这将是主键对(这意味着你不会允许在 table 中有两个相同的对(user_id 和 has_id)。
所以当你想从 table 中提取数据时,让我们说一下 user_id 5 下的用户,你会用这样的东西来做到这一点
SELECT user_has.user_id, user_has.has_id, has.name
FROM user_has INNER JOIN has
ON user_has.has_id = has.has_id
WHERE user_has.user_id = 5;
当您插入时,您只需将 user_id 和 has_id 插入 user_has table 中,这将生成新的一对...等等...
我想将用户信息存储在table。
第一个例子 这些领域是例如。 "has car"、"has flat"、"has cat"、"has dog"、"has LCD TV"、"has notebook"...
字段的值可以是y/n或y/null(null表示table中的空值)。
上面的字段是随机填充的,例如。 "y"、"null"、"null"、"null"、"y"、"null" 或者 "y"、"n"、"n"、"n"、"y"、"n"
所以只有那些字段包含对我有用的信息,这些字段已填写 "y",因为当我使用查询时,我只想查看那些字段的结果,这些字段仅包含 "y" 值。
这是否有可能,因为显然每条记录的结果都会与其他记录不同?
方案二 我创建了一个 table 来存储用户 ID 和用户的 属性,例如
用户 ID 属性 1 有车 1 有狗 2 有液晶电视 3有平 3 有笔记本 3 有猫
这里没有存储不必要的信息,但DB可以有超过100000行。
我的问题是最好的存储方法是什么。大约 100-120 属性 将用于一个用户。并且将有另一个 table 将连接到原始 table,后者还将包含另外 50 个类似的 属性 (y/null).
我认为第二种解决方案最好,但我对速度有疑问。当然会使用主键,并且会收到更重要的字段(外键)"Unique"。 (听说用unique可以更快收到结果。)
你觉得上面写的怎么样?
提前感谢您的回答。
致以最诚挚的问候&美好的一天, 姿态
哪个更好取决于数据的查询方式以及未来可能发生的变化。 (TL;DR - 第一个解决方案糟透了)。
假设您要运行 查询以找出哪些用户养了一只狗。为了避免查看数据库中的每一行,您需要一个索引 - 这意味着您需要为 table 中的每个字段创建一个索引。
现在考虑当您想要添加一个新的 "has" 时会发生什么。为了使 space 成为新属性,您需要重写 table 中的每一行(这并不严格,因为 MySQL,就像大多数数据库倾向于添加一个一点备用 space,但在某些时候这将被耗尽)。当然,在您应用新架构时,您的 table 将在一段时间内无法使用 - 每次添加新资产时都必须更改架构。
对于您可以在两个模型上 运行 进行的所有可能查询中的一小部分,为每个资产使用单独的列会更快,但对于绝大多数而言,它没有什么不同或更快使用 user/key/value table。执行插入肯定会快很多,因为您只需要更新一个或两个索引。
从我的角度来看,如果我理解正确,这里最好的解决方案是在 table user 之间创建多对多关系(其中包含 user_id 和一些关于用户的信息(如果需要)和第二个 table 让我们称之为 has 它将包含 has_id 和名称(将存储用户有什么狗、电视、猫等)。
要创建多对多关系,您需要第三个 table,称为联结 table,可以将其命名为 user_had 并且包含一对字段 user_id 和 has_id 这将是主键对(这意味着你不会允许在 table 中有两个相同的对(user_id 和 has_id)。
所以当你想从 table 中提取数据时,让我们说一下 user_id 5 下的用户,你会用这样的东西来做到这一点
SELECT user_has.user_id, user_has.has_id, has.name
FROM user_has INNER JOIN has
ON user_has.has_id = has.has_id
WHERE user_has.user_id = 5;
当您插入时,您只需将 user_id 和 has_id 插入 user_has table 中,这将生成新的一对...等等...