2011-02-17 69 views
1

我迫切需要算法或查询构造帮助。算法或需要MySQL查询建议

我们有一个用户生成的灵活的数据库,它是使用我们创建的表单生成器创建的。这些表单的数据存储在两个表中,如下所示: enter image description here

实例表告诉我们用户正在查看什么样的表单,然后instance_records表包含实例的所有数据。 field_id列告诉我们数据映射到表单上的哪个字段。我们使用这样的单个表而不是为每个表单创建表的原因是MySQL限制了表中有多少列,因为数据是具有相当长度的varchar。一种可能性是使用文本字段作为数据,但是我们会失去内置的MySQL搜索功能。

事情在基本形式上工作得很好,速度非常快。问题是表单的一个实例可以引用表单的另一个实例。例如,我们有用户创建的窗体,称为约会。在这种形式下,它指的是患者形式,技术人员形式,医生形式等。

因此,在具有实例ID的约会表单上,患者字段的值实际上是患者的实例ID,医生字段值是医生的实例ID等。在第一级引用中,事情并不太糟糕。但是,您可以拥有参考链。我可以有一个处方,指的是一个指定病人的约会等。所以,如果我想要在处方上获得患者姓名的价值,我必须遵循链条以获得正确的实例ID和字段数据ID。因此,如果我想要做一个约会报告并显示患者姓名,医生姓名和技术员姓名,我必须经历一些环节。我所尝试的是创建视图,然后将视图加入到显示查询的所有数据的最终视图。但是,它消耗了大量内存,并开始将视图临时表写入磁盘,并且变得很慢。第二次使用查询缓存时,报告运行速度非常快。但是,一旦我们获得超过5000-7000个实例,第一次运行可能需要一分钟。

在我脑海里发痒的一件事是,可能有某种方式来存储数据,以便我可以利用一些更快的树搜索算法。

+0

请告诉我实际的问题吗? – 2011-02-17 00:11:27

+0

有没有人有任何想法有效地从数据库检索参考数据报告? – 2011-02-17 00:21:37

回答

2

你应该读了在EAV ... This article might give you some ideas ...它谈到了两种不同的方法来存储值。无论是哪种方法,您最终都会对任何给定表单进行单个查询,从而实质上获取主实体的所有值(在本例中为表单)。然后,无论是在应用程序端还是在数据库端,您都可以将这些值合并在一起,以供应用程序使用。

形式本身应该是具有字段的列表中的单个原子单位,你不需要储存形成一个字段实际上来自于你只需要把它保存为完整的表单字段。在创建过程中,您应该开发用于在应用程序端将字段合并为单个表单的逻辑。

1

这听起来像你正试图在数据库中创建一个数据库。有一个dailywtf链接,我正在寻找...

无论如何,它听起来像你需要一个预约表,一个病人表,一张医生桌和一张技术员表,然后你需要加入他们正常。

例如,看到病人,医生,和从预约科技股昨天,你可能会做

SELECT 
    Appointment.start-time 
    Appointment.end-time 
    Patient.name 
    Patient.insurance-carrier 
    Doctor.name 
    Tech.name 
    Tech.home-lab 
FROM Appointment 
JOIN Patient on Appointment.patient-id = Patient.patient-id 
JOIN Doctor on Appointment.doctor-id = Doctor.doctor-id 
JOIN Tech on Appointment.tech-id = Tech.tech-id 
WHERE Appointment.appointment-date = $YESTERDAY 

编辑:让我们给病人的例子与字段的可变数目

表病人 - 包含数据的患者会有

| ID | Name  | Insurance Carrier | .. other fields 
+------+-------------+-------------------+------- 
+ 0001 | John Doe | ABC Healthcare | 
+ 0002 | Jane Doe | ABC Healthcare | 
+ 0003 | Jon Skeet | C# Insurance Inc. | 
+ 0004 | Mark Byers | Gold Badge Health | 
+------+-------------+-------------------+------- 

表病人表格

| Form-Name | Form-Field | Required | Default-Value | 
+-----------+------------------+----------+---------------| 
| Vitals | Blood Pressure | TRUE  | null   | 
| Vitals | Pulse   | TRUE  | null   | 
| Vitals | Ear Temperature | FALSE | null   | 
| Lab Work | Lab Room   | TRUE  | Lab-001  | 
| Lab Work | Technician  | TRUE  | null   | 
| Lab Work | Insurance Covers | TRUE  | NO   | 
| Payment | Balance   | TRUE  | $0.00   | 
| Payment | Co-Pay   | FALSE | 0.00%   | 
| Payment | Deductable  | FALSE | $0.00   | 
| Payment | Payment Terms | FALSE | 30 Days Full | 
+-----------+------------------+----------+---------------| 

表病人表格场 - 包含了可能或不可能为病人提供的数据

| Patient-ID | Form-Name | Form-Field | Form Value | 
+------------+-----------+------------------+------------+ 
+ 0001  | Vitals | Blood Pressure | 130/54 | 
+ 0001  | Vitals | Pulse   | 84bpm  | 
+ 0001  | Vitals | Ear Temperature | 98.4F  | 
+ 0002  | Vitals | Blood Pressure | 126/74 | 
+ 0002  | Vitals | Pulse   | 87bpm  | 
+ 0002  | Vitals | Ear Temperature | 99.0F  | 
+ 0003  | Lab Work | Lab Room   | SO-Meta | 
+ 0003  | Lab Work | Technician  | Rose Smith | 
+ 0003  | Lab Work | Insurance Covers | TRUE  | 
+ 0003  | Vitals | Blood Pressure | 190/100 | 
+ 0003  | Vitals | Pulse   | 213bpm  | 
+------------+-----------+------------------+------------+ 

您现在可以查询这个是这样的:

SELECT 
    Patient.name 
    Patient-form-field.form-name 
    Patient-form-field.form-field 
    Patient-form-field.form-value 
FROM Patient 
JOIN Patient-Form-Field on (Patient.patient-id = patient.id 
         AND Patient-form-field in ("Vitals","Lab Work") 
          ) 
WHERE Patient.patient-id IN ("0001","0002","0003") 
+0

硬编码表不是一个选项。该应用程序特别允许用户创建自己的表单和业务逻辑。 Zoho创作者具有类似的功能。 – 2011-02-17 00:28:05