2011-02-17 67 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