2009-11-19 183 views
1

我正在使用SQL Server 2005 Express和Visual Studio 2008.SQL Server:一個表格包含400列或40個表格包含10列?

我有一個包含400列的表的數據庫。在我必須在多個數據庫之間執行雙向同步之前,事情是(幾乎可以控制的)。

我想知道哪些參數是和反對使用400列數據庫或40表數據庫是?

該表格未歸一化,主要由nvarchar(64)列和一些TEXT列組成。 (沒有數據類型,因爲它是從文本文件轉換而來的)。

還有另外一個錶鏈接到這個表並且是1-1關係(即一個條目涉及400列表中的一個條目)。

該表是包含「插入」到應用程序中的參數的列表文件。

我期待着您的回覆。

謝謝

+0

所以每個用戶擁有支配自己怎麼應用程序實例運行設置的屬性在表中的行? 因此,當您添加一個新的功能區域時,您必須添加一堆列併爲每個用戶填充適當的默認值。 爲什麼你必須做雙向同步?這是你唯一的麻煩嗎?還有哪些其他活動使這種難以管理的行爲? – 2009-11-19 11:43:07

+0

有一箇中央服務器和幾個客戶端服務器都運行數據的本地副本。客戶需要將任何更改合併到中央數據庫中。服務器還需要合併客戶端所做的任何更改。 使用同步框架並遵循c#的示例,我不得不指定所有需要同步的列。我還必須創建一些存儲過程,這些過程也需要在幾處代碼中使用所有列。從那時起它變得非常難以控制! – Belliez 2009-11-19 11:50:15

+0

所以,如果理解正確,一堆ini文件被存儲到數據庫中。是否所有400列都填充在每行中,或大多數是NULLS?每個用戶是一行還是每一行?這是爲一個應用程序或許多隨機應用程序的設置? – 2009-11-19 23:26:52

回答

2

根據您的流程描述,我會從這樣的事情開始。模型簡化了,沒有捕捉歷史等 - 但這是一個很好的起點。注意:參數=屬性。


- 設置性質的集合。一個設置可以有很多性質,屬於一個設置只有一個財產。
- 可以有很多設置,一個設置屬於一個只。
- 屬性是一種特定類型(溫度,運行時間,主軸轉速)的,可以有很多屬性一定類型的
- 測量性狀屬性的類型測量是一個數字屬性,像速度。 特性是一個描述性的屬性,喜歡顏色或一些文字。

machine_model_01

+0

哇,謝謝你的努力。當我執行本週重新安排桌子的艱鉅任務時,我會記住這一設計...... 再次感謝。這是非常讚賞。 – Belliez 2009-11-23 16:31:45

+0

有一個問題,如果我的系統爲每個屬性有不同的數據類型,這是一個新表,即Trait = descriptive,Measurement = float和一個名爲Counter stores(int)數據類型的新表等?我對此有點不確定。 – Belliez 2009-12-04 10:50:21

+0

這裏有幾個選項,如您所述,選項1 - 選項2 - 在'measurement'中使用int(bigint)作爲數據類型,併爲格式添加一個字段,在讀取時將其轉換爲十進制。這相當於以較小的單位存儲數據。 – 2009-12-04 11:55:34

2

對於有大量表:

  • 快速報告上,因爲它的大概非規範化等方面無接縫是必要的。
  • 最終消費者易於理解,因爲他們無需在頭上持有數據模型。

針對具有大表:

  • 可能需要有多個綜合指數以獲得良好的查詢性能
  • 更難以保持數據的一致性,即需要更新多行,當數據的變化,如果說數據位於多行
  • 由於您不得不更新多個行並維護多個索引,因此隨着鎖升級,更新的併發性能可能成爲問題。
  • 如果屬性與該行上的實體無關,可能會導致處理結果變得很尷尬,您最終可能會得到列中有大量空值的記錄。
  • 如果懶惰的開發人員從表中執行SELECT *,最終會在網絡中拖動大量數據,所以您通常必須維護合適的子集視圖。

所以這一切都取決於你在做什麼。如果表的主要目的是OLAP報告並且更新不頻繁並且影響很少的行,那麼可能是一個寬的非規格化表是正確的。在OLTP環境中,它可能不是,你應該更喜歡更窄的表。 (我一般採用3NF設計,然後在進行查詢時進行非規範化處理)。

如果這是他們想看的東西,那麼您總是可以採用規範化的方法併爲讀者提供廣泛的視圖。

不知道更多關於這種情況,真的不可能在你的特定情況下多說一些利弊。

編輯:

鑑於你已經在你的評論說,你有沒有考慮只是有一個長&瘦名稱=值對錶,所以你只希望有用戶ID,屬性名,列的PropertyValue?您可能還想在其中添加一些其他元屬性;時間戳,版本或其他。 SQL Server在處理這些類型的表時非常高效,因此不要像這樣折扣簡單的解決方案。

+0

我確實認爲這導致了昨天的以下問題: http://stackoverflow.com/questions/1755562/sql-syntax-create-a-single-table-with-column-從數據存儲中創建名稱 事情開始變得複雜起來! – Belliez 2009-11-19 14:26:05

+0

我的確嘗試了長而瘦的列表方法,但由於屬性都是不同的數據類型,所以很難對其進行排序並使其可用。 – Belliez 2009-11-24 11:51:00

+0

如何使用一個記錄名稱和屬性類型的邊表(以及其他任何約束,如isNullable等),然後將所有實際屬性存儲爲varchar/text並讓消費者根據需要解釋它們(您可能會想要在name = value表中包含number和varchar/text列,但這是一個實現細節)。 – 2009-11-24 13:16:27