【问题标题】:suggestion for creating mysql database structure创建mysql数据库结构的建议
【发布时间】:2014-01-06 19:31:20
【问题描述】:

我目前正在构建自定义应用程序。我的第一个模块已经完成,现在我仍在研究如何为第二个和第三个模块创建结构,以便完美地工作而不会出现任何错误或最糟糕的整个数据库崩溃。

一些信息:-

我的第一个模块,数据是手动导出的,因为数据库是我的第二个和第三个模块使用的主要结构。

我的第二个模块数据是报告日志,点击提交按钮后数据会自动进入数据库,(我假设类似于自动保存)这个模块将作为我的报告列表,就像本周的客户访问次数一样,顶级客户等。

报告当天访问的结果:

Customer Name | Date of Birth | Visit Count | Amount
   John Doe   |  1948-01-29   |       1     |   10
 Guest Guest  |  1968-12-16   |       1     |   10

我的第三个模块将是个人资料搜索,其中数据也会在按钮提交点击后自动进入数据库。该模块将用于用户搜索配置文件并继续第一个模块以及报告使用列表,如上述行为。

log

我目前的结构
  • log_id (人工智能)
  • dob
  • log_datetime
  • log_count
  • 金额

profile

的结构
  • profile_id (AI)
  • dob
  • 行内
  • 行二
  • 第三行
  • 名字
  • 姓氏

现在我需要将profile 附加到log,当我使用我的第二个模块进行报告时,报告将显示log 表中的详细信息:doblog_datetime、@ 987654329@、amountprofile 表:first_namelast_name

如果我将profile_log_id 添加到log 表并得到lastinsertID,则存在用户可能无法输入first_namelast_name 的问题:因此我将Guest 用于@987654340 @ 和 last_name 列。

另外,如果细节相同,我将使用On Duplicate 更新表格,例如如果first_namelast_namedob组合已经存在,它将更新现有的profile表。

那么,有什么方法可以让我获得更好的数据库设计结构,以确保数据不会相互冲突,并且我仍然可以使报告和配置文件搜索模块完美运行?

抱歉,我的问题冗长而复杂,因为这是我第一次构建应用程序并且缺乏数据库设计经验。感谢所有帮助我提出更好的结构建议和建议的人。

补充说明:

  1. 第一个计算 dob 的模块存储了一个表,其列为 dob_iddobrowonerowtworowthree 我无法对此进行更多解释,因为该模块是基于写入的关于我妈妈的日常使用。所有的数据都是手动录入数据库,作为主数据拉过来的。
  2. 第二个模块是log,用于记录每日日志以供报告。 dob 列代表每日客户dob,而log_count 代表访问时间amount 代表他们为每次访问支付的金额。李>
  3. 第三个模块是profile,用户在第一个模块的dob搜索过程中选择填写或不填写客户名称,这是用户输入日期、月份和年份的表单(必填字段) 和姓氏作为可选的名字。由于查询和插入是分开进行的,因此主数据首先提取数据,脚本的结尾将是从主表中提取数据的插入(dobrowonerowtworowthree ) 被输入到配置文件表和日志表中(仅限dob)。 log_countamount 已设置,因此每次插入时都会将值返回到数据库。
  4. 由于名字和姓氏是一个可选值,因此我将把一个空的名字和姓氏替换为GuestGuest`用于记录目的。
  5. 我需要一个搜索栏,用户可以直接在profile表中搜索名字和姓氏,并列出first_namelast_namedobrowone、@987654372的所有数据@、rowthree 匹配搜索条件。这仅用于普通客户,通过记录他们的个人资料来简化搜索,而不是在他们每次访问和搜索时不断询问他们的dob。这就是为什么如果 dob first_namelast_name 匹配,我将使用更新现有记录而不是继续插入相同的数据,以避免配置文件搜索显示重复数据。

现场案例场景。

1 月份:共有 20 位客户访问。

  • 记录了 4 位客户访问,并且是同一个人 (John Doe - DOB: 1948-12-19)。
  • 记录了 3 次客户访问,并且 与前 4 次访问不同的人(John Doe - DOB:2000-07-31)
  • 5 位客户访问记录为同一个人(Vin Diesel - DOB: 1959-03-22)
  • 5 位客户访问记录为同一个人(Teresa John - DOB: 1988-05-18)
  • 记录了 1 次客户访问(Guest Guest - DOB:1977-11-17)
  • 记录了 1 次客户访问(Guest Guest - DOB:1962-09-28)
  • 记录了 1 次客户访问(Guest Guest - DOB:1977-11-17)

Guest 客人不可合并参观:

加入logprofile表的报表结果

Customer Name | Date of Birth | Visit Count | Amount
   John Doe   |  1948-12-19   |       4     |   40
   John Doe   |  2000-07-31   |       3     |   30
  Vin Diesel  |  1959-03-22   |       5     |   50
 Teresa John  |  1988-05-18   |       5     |   50
 Guest Guest  |  1977-11-17   |       1     |   10
 Guest Guest  |  1962-09-28   |       1     |   10
 Guest Guest  |  1977-11-17   |       1     |   10

总客户访问次数: 20

总收入: 200

所以我需要log 来记录每个表单提交的数据但是profile 如果first_namelast_namedob 的条件不匹配或匹配,我需要插入,然后它将更新记录。如果报告是年度报告,则访问次数和访问量将在首次记录 logprofile 时累加。

对于个人资料搜索,用户将只输入一个名称并返回与搜索匹配的值,例如用户输入John,查询将从表first_namelast_name 中找到应返回以下内容结果:

Customer Name | Date of Birth | Visit Count | Row One | Row Two | Row Three
   John Doe   |  1948-12-19   |       4     |   3     |    8    |     12
   John Doe   |  2000-07-31   |       3     |   7     |    1    |     6
 Teresa John  |  1988-05-18   |       5     |   2     |    10   |     8

访问次数将从创建个人资料的第一天开始计算,直到当前。

这很复杂,因为我认为它需要与其他表相互链接,但我希望有更好的方法来设计logprofile 表,而不是让整个数据库崩溃。 我不是要求为我编写代码,但我正在寻找更好的数据库设计的答案,以满足预期的结果。

旁注:目前,该应用程序没有用户登录,但在我解决这个问题后会实施它。出于应用目的,用户登录仅限于管理员和用户。访客或客户无权登录,因为注册是在管理面板中进行的。

希望这些信息能让这里的每个成员更清楚地了解我的意图和期望的结果。

【问题讨论】:

  • 规范化设计通常是最好的方法。如果你不知道那是什么意思,我听说过这本书的好东西,数据库设计为凡人。
  • @nescafe,我已经添加了一个答案,但它可能需要根据您的说明进行更改/删除:log 表上的 doblog_countamount ? profile 表上的rowone 等是什么?用户是登录,还是只输入他们的姓名/dob 详细信息? “访问次数”究竟是为了显示什么? hth

标签: mysql sql database database-design database-schema


【解决方案1】:

如果我理解正确,log 用于自动记录用户操作的详细信息,profile 保存用户详细信息。

对于log 表,您似乎正在尝试保存汇总数据,每次提交表单时都需要更新这些数据。我建议您只需插入一个新的日志条目 [例如log_idlog_dateprofile_idamount] 提交并将汇总留给报告。要启用从logprofile 的连接,我们包括profile_id

对于profile 表,您可能应该允许first_name|last_name|dob 的重复条目,并尝试找到另一种使它们唯一的方法(使用profile_id,或通过电子邮件,或护照号码)。

我不确定您对 rowonerowtworowthree 的意图。如果您知道它们是什么,请明确命名它们;如果它们用于重复未知次数的项目,请考虑将它们移动到单独的表中(即标准化)。

对于您的报告,您将编写一个查询以将logprofile 表连接在一起,并在必要的字段上进行聚合(即GROUP BYSUM 和/或COUNT。"访问计数”将是该配置文件的日志条目的 COUNT,“金额”将是 amountSUM

【讨论】:

  • 我编辑了我的第一篇文章,提供了更多信息和案例场景,希望它可以让您更清楚地了解我打算做什么,以便数据库设计能够满足它。
  • 我已根据您的进一步说明进行了更新。老实说,我仍然不是 100% 清楚。如果您有一个简单的、未汇总的 log 表连接到 profile,那么您应该不会遇到“数据库崩溃”的任何问题。
猜你喜欢
  • 2012-01-06
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2016-05-21
  • 2016-12-16
相关资源
最近更新 更多