2012-08-31 42 views
-1

我找到一種方法將多個表散列表代表到單個表中有問題。代表多個表的單個表

說我有3代表的格式:

Table1(Table1_PK1,Table1_PK2,Table1_PK3,Table1_Hash) 
Table2(Table2_PK1,Table2_PK2,Table2_Hash) 
Table3(Table3_Pk1,Table3_PK2,Table3_PK3,Table3_PK4,Table3_PK5,Table3_Hash) 

Table1_PK1Table1_PK2Table1_PK3 ......在列,他們可能有不同的數據類型(VARCHARINTDATETIME ...)。 我的問題是,如果有一種方法可以創建一個表(固定數量的列),可以代表所有這3個表(可能更實際)。

我想爲我的數據庫工具做到這一點。每個表格實際上是一個包含主鍵和與它們相關的散列數據的表。

+1

他們是否有外鍵或某種方式來識別哪些行屬於一起? –

+0

否。每個表中除Hash字段外的所有字段都是主鍵(複合主鍵)。 例如:Table1_PK1,Table1_PK2,Table1_PK3是表1中的主鍵 – stoney78us

+0

請解釋_why_你想合併它們嗎?有可能有更好的方法來實現你想要實現的任何目標...... –

回答

0

爲什麼將3個表合併爲一個?會很糟糕的分貝設計。但這裏有一個辦法做到這一點:

一個表將有你在決賽桌要爲每個3代表列的列。我想提出的假設是TableX_Hash是同一類型的,所以仍然是一個獨特的列:

Table_All_in_One (
    Table1_PK1, 
    Table1_PK2, 
    Table1_PK3, 
        # space just for clarity of grouping 
    Table2_PK1, 
    Table2_PK2, 

    Table3_PK1, 
    Table3_PK2, 
    Table3_PK3, 
    Table3_PK4, 
    Table3_PK5, 

    TableX_Hash  # Assuming all the _Hash'es are the same type+length, 
        # otherwise, add Table1_Hash, Table2_Hash, Table3_Hash 
        # This can be your new primary key 
) 

的主鍵(PKx)被要求只在自己的表非NULL。對於這張表,他們必須允許空值。 這個想法是,這個新表的每一行只會保存其中一個表的數據。該行的其他列將爲空。如果你想一個表的行與另一個相關聯,您可以添加到同一行或添加FK_Table1_HashFK_Table2_HashFK_Table3_Hash列,這將是指記錄的TableX_Hash值。

PS:我不知道你真正尋找的是一個View,而不是這個非常糟糕的所有功能於一身的表。


編輯:將它們組合成一個「不知道表有多少個主鍵」。按您的評論:連接成一列

店內所有_PKs:

Table_All_in_One (
    New_PK, 
    TableX_Hash, 

    Table1_PKx,  # Concatenated PKs of Table1 
    Table2_PKx,  # Concatenated PKs of Table2, etc. 
    ..., 
        # OR just one 
    TableX_PKs,  # concatenate all the PK's into one VARCHAR field 
        # Add a pipe `|` between them optionally. 
    Table_Num  # If using just one, then you'll need to store the table number 

) 基於它們的複合主鍵的一部分將不能夠方便地挑選記錄。它將始終是TableX_PKs = CONCAT_WS('|', Table1_PK1, Table1_PK2, ...)。所以你唯一的依賴是原始列中PK的數量。

+0

感謝您的文章,但這不是我正在尋找的內容。所有3個表格在所有領域都是獨立的。比方說,如果我想將Table10的10個主鍵的10列數據添加到Table_All_in_One中,這會失敗。 – stoney78us

+0

即使這樣,這也可以正常工作。你只需要確保'Table_All_in_One'具有所有其他表的所有列。當您將表10的10列數據添加到All_in_One(「Table10_PK1,_PK2 ...,PK10」)時,All_in_One(「Table2_PK1,Table3_PK5」等)的其餘列將爲空/ NULL。 – aneroid

+0

嗯...我仍然在尋找一種動態的方式來做到這一點,而不需要知道表中有多少個主鍵。 – stoney78us

1

既然你顯然建庫工具,而不是一個數據庫,它可能會更有意義在應用程序代碼,而不是在數據庫表來做到這一點。

在一個不同的答案,您的評論

我仍然在尋找一個動態的方式做到這一點不知道一個表可以有多少主鍵有。

甲表只能有一個主鍵。不過,該主鍵可以由多個列組成。(您已經知道這一點;您只是使用了錯誤的詞彙,這可能會讓其他人感到困惑。)

表中還可以包含任意數量的其他鍵,這些鍵將被聲明(如NOT NULL UNIQUE)或「未聲明」(通過創建一個索引來保證一組列的唯一性)。

你可以看看全部在運行時以一種或兩種方式填滿。 (鏈接到文檔的PostgreSQL。)

據我所知,所有的現代SQL平臺實現這些接口中的至少一個。 SQL標準涵蓋了information_schema視圖,但似乎還有一些解釋空間。在所有平臺上它們看起來都不一樣。

0

爲了建模一堆表格,你需要3個表格。包含您希望以此方式設置的表的表名稱的實體表稱爲因子或實體表。包含表格的所有列及其關聯屬性的Factor_detail表。一個表,factor_detail_value,用於存儲查找表的查找值等內容。我也試圖更好地瞭解這一點,因爲我們也在使用這種技術。爲任何如此編碼的表提供Genrate SQL,並將數據存儲在與數據本身相關的存儲庫中。這樣,如果表更改並且需要添加列或更改數據類型,則可以向因子詳細信息表中添加一行,而不影響數據庫在生產中的關閉。在大多數企業中,關閉一個四小時以更改sql數據表可能會花費數千美元。例如,如果您正在處理保險業務,那麼您銷售保險的每個其他州都有不同的要求,因此可以對其進行調整並導致表格更改。我們通過這種方式將表格數量從700多個表格中減少,同時我們也可以在沒有數據庫關閉的情況下進行更改,從而避免收入損失。