繁体   English   中英

数据库设计-在一个表或多个表中保留多种报告类型

[英]Database Design - Multiple report types kept in one table or multiple tables

我已经阅读了以下问题的答案,并且我相信它们指向两个不同的答案:

数据库设计:多个表与单个表

MySQL问题-如何处理多种类型的用户-一个表还是多个表?

我的数据库:MySQL我的语言:PHP我的问题:我有4个报告要保存在数据库中(将来可能会更多)。 每个报告具有不同的输入。 我为每个模块创建了一个不同的模块。 我试图通过创建一个表来存储公共列(createddate,createdby,reportnumber,title等)来使用面向对象设计。 但是,我最后得到了大量代码,这些代码根据所使用的报告以及其他参数来确定要查看哪些表。 基本上,这似乎比我在每个模块中使用大量相同代码并具有该报告所需的确切表和列名称的情况还要大。 当然,我遇到了此组合表中至少需要两列的问题,对于某些报告而非其他报告,它们将具有NULL值。

上面链接中的一个答案说创建多个表(很多),而另一个答案说有1个公用表,其中有针对特定用户的多个特定表(在我的情况下为报告)。

除非我误解了我在阅读的内容,否则情况很可能会如此。

我的问题:我应该为每个报告创建单个表,并在代码中创建类似的查询和表设置,还是为所有报告创建一个主通用表,并拥有查询数据库并布置表的代码,但需要传递许多变量或有能力查找所需的表/列/路径/标题信息?

编辑2:抱歉造成混乱

这是我第一次吃的

数据库表

abc_reports: abc_id, site, system, country, reportnumber, title, createddate, statusid (no duedate)
abc_details: abcdetails_id, abc_id, abc_date, abc_time, location, description, actions
abc_qa: abcqa_id, abc_id, near_miss, opp_improv, level

def_reports: def_id, country, reportnumber, title, createddate, duedate, statusid (no site/sytem, but added duedate)
def_details: defdetails_id, def_id, jobnumber, type, partnumber, part_descrip, serial_num
def_qa: defqa_id, def_id, major, disposition, rep_required, dispo_descrip, dispo_date

xyz_reports: xyz_id, site, system, country, reportnumber, title, createddate (no statusid or duedate)
xyz_details: xyzdetails_id, xyz_id, customer, workgroup, contract_num

网页布局:ABC报告:报告说明,添加新ABC报告的表单,摘要表(html),显示最后几个报告,列标题为“创建日期”,“创建者”,“报告编号”,“标题”,“状态”,“国家/地区”和“站点”

DEF报告:报告说明,添加新DEF报告的表单,摘要表(html),显示最后几个报告,其列标题为“创建日期”,“创建者”,报告编号,标题,状态,到期日和“国家/地区”

XYZ报告:报告说明,添加新XYZ报告的表单,摘要表(html),显示最后几个报告,列标题为“创建日期”,“创建者”,“报告编号”,“标题”,“国家/地区”和“站点”

SQL查询和html表的布局将专门为每个报告量身定制。

看到我将使用非常相似的查询并显示非常相似的表,我选择删除“ _reports”表并替换为一个表“ reports”,所以现在这些表是这样的:

reports: report_id(auto-increment), site, system, country, reportnumber, title, createddate, etc
reportstatus: report_id(inserted after new report on reports table), statusid, assignedto, duedate, reviewed, declined, etc

abc_details: abcdetails_id, abc_id, abc_date, abc_time, location, description, actions
abc_qa: abcqa_id, abc_id, near_miss, opp_improv, level

def_details: defdetails_id, def_id, jobnumber, type, partnumber, part_descrip, serial_num
def_qa: defqa_id, def_id, major, disposition, rep_required, dispo_descrip, dispo_date

xyz_details: xyzdetails_id, xyz_id, customer, workgroup, contract_num

现在,网页布局需要在报告表中搜索摘要信息,但是现在必须查找带有前缀的报告号,该前缀与用户正在查看的模块相匹配。 因此,我创建了一个针对每种报告类型返回变量数组的函数(SQL查询中“ use_due_date”为布尔值,“ use_status_id”为Boolean,该特定报告的详细信息网页的路径,报告名称(ABC或DEF,等等),其特定表的SQL Joining语句等。每当用户查看报表模块时,此函数就会由现在通用的摘要表调用。

这是一个示例:

$sSQL  = "SELECT ";
$sSQL .= "r.reportid, ";
$sSQL .= "r.reportnumber, ";
$sSQL .= "r.title, ";
if ($arrModValues["siteused"]) { $sSQL .= "r.siteid, "; }
$sSQL .= "r.createddate, ";
$sSQL .= "rs.statusid, ";
if ($arrModValues["duedateused"]) {
    $sSQL .= "rs.duedate, ";
    $sSQL .= "rs.duedate < CURDATE() AS is_pastdue, ";
    $sSQL .= "rs.duedate <= CURDATE() + 7 AS is_almostdue, ";
}

$sSQL .= "rs.reviewed, ";
$sSQL .= "rs.declined, "
$sSQL .= "rs.finalized, ";
$sSQL .= "r.createdby, ";
$sSQL .= "rs.assignedto ";
$sSQL .= "FROM reports r ";
$sSQL .= "LEFT JOIN reportstatus rs ON r.reportid = rs.reportid "
$sSQL .= get_joining_statement($sMod);
$sSQL .= "WHERE ";
$sSQL .= "moduleid = '$sMod' AND ";
$sSQL .= "countryid='$sCountry' ";
$sSQL .= "ORDER BY ";
$sSQL .= "createddate ";

$sSQL .= "DESC";


// get the query results

$arrResults = query($sSQL);

Then the common table:
if ($arrResults) {

// get headers for header table

$arrHeaderDef = array();

$arrHeaderDef[]     = "Created";
$arrHeaderDef[]     = "Report Number";
$arrHeaderDef[]     = "Title";
if ($arrModValues["siteused"]) { $arrHeaderDef[] = "Site"; }
$arrHeaderDef[]     = "Status";
if ($arrModValues["duedateused"]) { $arrHeaderDef[] = "Due Date"; }

$arrHeaderDef[]     = "Disposition";
$arrHeaderDef[]     = "Created By";
$arrHeaderDef[]     = "Assigned To";
$arrHeaderDef[]     = $arrModValues["coltitle"];
$arrTable[] = $arrHeaderDef;

等等...

我希望这不会使我的问题更复杂。 如果您想指出任何编程设计错误,请放心。

因此,最大的问题是:我应该单独保留原始表并为每个模块(报告)创建类似但特定的PHP / SQL代码,如上面第一个链接中的答案所建议的那样,还是我试图通过组合报表的常见元素,并创建常见的查询和表格布局,如上面第二个链接的答案所示? 还是没有? 设计该系统的更好方法是什么?

再次感谢你。 抱歉,它太长了,无法分类。

谢谢山姆

您打算获得多少报告?

我曾经遇到过同样的问题,并通过添加一个非常大的表来解决所有可能出现的列,从而解决了这个问题。 根据事件的不同,很多列将为空,但是一次查询一个表的麻烦就少得多。 但是为了使其具有可扩展性,我最终使用参考表每月自动创建一个新表,因为无论如何,查询最多的数据还是来自当月。

reftable
id, sekid, table (table would refer to which table below)

table201401
sekid,column,column,etc,etc,etc

table201402
sekid,column,column,etc,etc,etc

设置要查询的月份后,这将使每一列都易于搜索,依此类推。 但是取决于您要使用的数据,例如是否可以搜索和排序等等。 通过存储为json字符串可能会浪费很多数据。 就像将具有值的数组存储在单个列中一样。 并不是非常可搜索和可排序的,但是如果您只是需要打印出一些内容作为参考,则可以节省很多空间。

就我而言,我最终完成工作的主要原因是,本月的数据操作非常极端。 下个月,上个月的表仅用作参考,并偶尔进行更新。

每个案例都有其特殊的需求需要关注,并且始终认为大型且可扩展始终是一件好事。 找到可管理和可接受的平衡点。 我希望这篇文章能给您一些指导。 我以为我会分享,因为我记得自己曾经问过同样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM