2014-10-29 88 views
0

假設我有一個實體,例如:我應該爲一個(字符串)字段創建一個新實體嗎?

-id 
-name 
-address 
-phone 

然後,我想這個人擁有的東西,是一個字符串,並且可以重複很多次,每個人,例如附近,這是我覺得我應該做的:

-id 
-name 
-address 
-phone 
-idNeighborhood 

,並創建一個新的表

鄰居

-id 
-name 

和當然,idNeighborhood是一個外鍵鄰居的ID。

現在,我在想的是,我將不得不每次都使JOINS(假設我將使用90%的案例中我想使用某人的鄰域),那麼,這是錯誤的嗎?

-id 
-name 
-address 
-phone 
-neighborhoodName 

中,我將保存街區的名字,但當然會重複很多次(在其他情況下,我會重複很多ID的..所以...)..

另外,在我的特殊的情況下,鄰居永遠不會成長,它總是會有一個名字,這就是爲什麼我認爲這樣做更好,但我不太確定.. 我認爲唯一的缺點是我不能做一個鄰域的指數,然後它會變慢,或不?

+0

爲什麼所有的EF人都認爲加入是魔鬼? – 2014-10-29 21:03:01

+0

另外,爲什麼一個人有不止一個鄰里? – 2014-10-29 21:14:23

+0

@AaronBertrand我從來沒有說過一個人會有不止一個社區,但是一個社區會有很多人。而且這並不是說連接是惡魔,只是在任何情況下我都必須在任何地方加入連接。 – 2014-10-29 23:51:38

回答

1

這走的是一個關於要建模什麼問題。您應該在數據庫中建立與您嘗試使用系統解決的問題相關的東西。

你有興趣將社區作爲自己的實體嗎?

你想使一個鄰居表中的一些原因: -

  • 你最終會增加額外的屬性附近(比如,城市或州)
  • 你最終有兩個街區具有相同名稱,這實際上是不同的(所以他們需要一個身份超出他們的名字)
  • 你擔心存儲要求,你有相對較少的社區和很多人(身份證會更小)
  • 你想控制可以使用的鄰域主列表(人們只能從現有鄰域中選擇,不能只輸入任何舊的東西)

請注意,您也可以將所有相同的邏輯應用於名稱列。但是你只會這樣做,如果你的數據庫是人的名字,就像你應該做一個鄰居列相同的方式,如果建模鄰域將有助於解決你正在解決的問題。

+0

謝謝!這真的很有用,但這裏還有一個問題:比方說,我會按照鄰居進行大量查詢過濾,例如,讓所有處於XX鄰居的人都能夠過濾,那麼ID情況會更快,不是嗎?或者我可以創建varchar字段的索引(第二種情況下的鄰居名稱)? – 2014-10-29 23:54:24

+0

如果你想在特定的鄰居中找到每個人,ID會更快,因爲它會更小,因此IO更少等。如果你想要做'%blah%'等鄰居,那麼它可能會更快人桌直接。我不會根據這個性能方面做出決定,除非你認爲你有這麼多的行是非常重要的。在那種情況下,做一些測試。 – 2014-10-30 03:41:59

0

它實際上取決於您的需求。如果您需要顯示鄰居的詳細信息,如NAME,PROFESSION等。在您的應用程序中,它更好地使用第一種方法,即創建具有所需屬性的實體。

如果你真的不需要這些細節對你的鄰居的任何地方,你只需要姓名,你可以用你的第二個方法

相關問題