2009-04-23 19 views
14

Bạn thường chuẩn hóa một cơ sở dữ liệu để tránh dư thừa dữ liệu. Thật dễ dàng để nhìn thấy trong một bảng đầy đủ các tên mà có rất nhiều dự phòng. Nếu mục tiêu của bạn là tạo danh mục tên của mọi người trên hành tinh (chúc may mắn), tôi có thể thấy cách bình thường hóa tên có thể mang lại lợi ích. Nhưng trong bối cảnh của cơ sở dữ liệu kinh doanh trung bình là nó quá mức cần thiết?Bình thường hóa tên của một người có quá xa không?

(Tất nhiên tôi biết bạn có thể mất bất cứ điều gì đến một cực đoan ... nói nếu bạn bình thường xuống đến âm tiết ... hay thậm chí là cặp nhân vật liền kề. Tôi không thể nhìn thấy một lợi ích trong việc đi xa)

Cập nhật:

Có thể biện minh cho điều này là trình tạo tên ngẫu nhiên. Đó là tất cả những gì tôi có thể nghĩ ra từ đỉnh đầu.

+0

Tôi không chắc chắn ý của bạn là gì, bạn đang nói về việc thiết lập một bảng riêng biệt như "FirstNames" và sau đó liên kết người dùng với nó bằng "FirstNameID" hoặc một cái gì đó như thế? –

+0

Bạn có tên bảng nào? Nếu có nhiều tham chiếu đến cùng một cá nhân- và không chỉ cùng một tên- thì có, bạn có lẽ nên có một bảng người. –

+9

Erm. Không phải tên đã về cơ bản nomalised xuống nhân vật anyways? Chắc chắn đó là toàn bộ điểm của một bảng chữ cái? –

Trả lời

35

Chuẩn hóa cơ sở dữ liệu thường đề cập đến bình thường hóa trường, chứ không phải nội dung của trường. Nói cách khác, bạn sẽ bình thường hóa rằng chỉ có một trường tên đầu tiên trong cơ sở dữ liệu. Điều đó thường đáng giá. Tuy nhiên, nội dung dữ liệu không được chuẩn hóa, vì nó là cá nhân cho người đó - bạn không chọn từ danh sách và bạn không thay đổi danh sách ở một nơi để ảnh hưởng đến mọi người - đó sẽ là lỗi, chứ không phải tính năng.

+0

+1 Câu trả lời hoàn hảo. – IamIC

1

Tôi sẽ nói có, nó sẽ đi quá xa trong 95% + các trường hợp.

+3

Được rồi, tôi sẽ cắn; 5% trường hợp khác là gì? :-) –

+0

Tôi đang cắn quá, không phải bạn có nghĩa là 5% - ;-) –

+2

Một nửa người Hàn Quốc là Kim, Lee hay Park, và chỉ có khoảng 250 tên họ khác nhau (họ thậm chí có thể chỉ phù hợp với một byte !) – Quassnoi

2

Có, chắc chắn quá mức cần thiết. Một vài chục byte đặt cược bạn bè là gì?

+1

Không ai có thể cần nhiều hơn 640K –

1

Nói chung là có. Bình thường hóa đến mức đó sẽ đi xa. Tùy thuộc vào các truy vấn (chẳng hạn như sách điện thoại nơi tìm kiếm theo họ là phổ biến) nó có thể là đáng giá. Tôi hy vọng điều đó là hiếm.

+2

Và ngay cả trong kịch bản danh bạ điện thoại, một chỉ mục tốt sẽ là tất cả những gì cần thiết, nhưng vẫn có những cách sử dụng rất hẹp khi bình thường hóa tên có ý nghĩa. –

1

Có. Tôi không thể nghĩ ra một ví dụ mà lợi ích lớn hơn các vấn đề và biến chứng truy vấn.

53

Vâng, đó là quá mức cần thiết.

Mọi người không thay đổi tên của họ từ Bill thành Joe cùng một lúc.

+22

Điều này thực sự minh họa quan điểm. Lý do bình thường hóa là nếu bạn phải thay đổi thứ gì đó giống nhau trên cơ sở dữ liệu mà bạn không phải thay đổi toàn bộ các bản ghi. Nhưng bạn sẽ không bao giờ phải đổi tên của tất cả mọi người có tên là Bill thành Joe. – Kibbee

+0

Công việc tuyệt vời, điểm trực tiếp tuyệt vời! – curtisk

+0

Tôi không tranh chấp với tuyên bố rằng nó quá mức cần thiết cho hầu hết các trường hợp nhưng tôi nghĩ rằng lý do của bạn chống lại nó là thiếu sót. Chỉ cần chơi ủng hộ ma quỷ ở đây ... Giả sử bạn có một bảng FirstName và một bảng FullName. nếu một người thay đổi tên của họ từ Bill sang Joe, bạn sẽ không cập nhật khóa ngoài trong bảng FullName chứ không phải bản ghi trong bảng FirstName không? –

0

Tôi thường không thấy cần phải bình thường hóa tên, chủ yếu là vì điều đó làm tăng thêm hiệu suất trên liên kết sẽ luôn được gọi và không mang lại bất kỳ lợi ích nào.

Nếu bạn có quá nhiều tên tương tự và có vấn đề về dung lượng thì có thể đáng giá, nhưng sẽ có một lần truy cập hiệu suất cần được xem xét.

0

Tôi sẽ nói rằng điều đó hoàn toàn là quá mức cần thiết. Trong hầu hết các ứng dụng, bạn thường xuyên hiển thị tên của mọi người, mọi truy vấn liên quan đến điều đó sẽ trông phức tạp và khó đọc hơn nhiều.

0

Vâng, đúng vậy. Nó thường được công nhận rằng chỉ cần áp dụng tất cả các quy tắc bình thường hóa có thể làm cho bạn đi quá xa và kết thúc với một cơ sở dữ liệu quá chuẩn hóa. Ví dụ, có thể bình thường hóa mọi cá thể của mỗi ký tự để tham chiếu đến một bảng liệt kê ký tự. Thật dễ dàng để thấy điều đó thật lố bịch.

Việc chuẩn hóa cần được thực hiện ở cấp phù hợp với miền sự cố của bạn. Overnormalization là nhiều vấn đề như không bình thường hóa (mặc dù, tất nhiên, vì những lý do khác nhau).

1

Không, nhưng bạn có thể muốn bình thường hóa thành hồ sơ chuẩn cho khách hàng (vì vậy bạn không nhận được 5 mục nhập khác nhau cho 'Bloggs & Co.' trong cơ sở dữ liệu của bạn.Đây là một vấn đề làm sạch dữ liệu thường cắn vào các dự án MIS.

2

Có thể nếu bạn làm việc trong văn phòng Tổng điều tra, điều đó có thể có ý nghĩa. Nếu không, hãy xem mọi câu trả lời khác :)

5

Làm cách nào để bình thường hóa tên? Không phải tất cả các tên đều có cùng cấu trúc. Không phải tất cả các quốc gia hoặc nền văn hóa đều sử dụng cùng một quy tắc cho tên. Tên đầu tiên không nhất thiết chỉ là tên. Mọi người có số lượng tên khác nhau. Một số quốc gia không có cặp đơn giản của tên/họ. Điều gì sẽ xảy ra nếu tên đầu tiên của tôi chỉ là tên cuối cùng của bạn, liệu họ có được coi là giống nhau trong cơ sở dữ liệu của bạn không? Nếu không, sau đó bạn nhận được vào vấn đề mà tên cuối cùng có thể có nghĩa là những thứ khác nhau ở các quốc gia khác nhau. Ở hầu hết các quốc gia tôi biết, đó là một tên gia đình. Họ của bạn giống như ít nhất một trong họ của bố mẹ bạn. Trên Iceland, đó là tên của cha bạn, tiếp theo là "con trai" hoặc "con gái". Vì vậy, cùng họ sẽ có nghĩa là hoàn toàn khác nhau tùy thuộc vào việc bạn gặp nó ở Iceland và Mỹ.

Ở một số nền văn hóa, thông thường khi kết hôn, để người phụ nữ lấy họ của chồng mình. Trong các nền văn hóa khác, đó là hoàn toàn tùy chọn, hoặc thậm chí có thể làm việc theo cách ngược lại.

Bạn có thể chuẩn hóa điều này bằng cách nào? Bạn sẽ nhận được thông tin gì? Nếu bạn tìm thấy một người nào đó trong cơ sở dữ liệu của bạn có "Smith" là từ cuối cùng tạo nên tên của họ, điều đó cho bạn biết điều gì? Nó có thể không phải là họ của họ. Chỉ có thể là phần của tên gia đình. Nó có thể là một danh dự trong một số ngôn ngữ, nhưng theo văn hóa của họ, nên được coi là một phần của tên.

Bạn chỉ có thể chuẩn hóa dữ liệu nếu dữ liệu tuân theo cấu trúc chung.

0

Có thể có trường hợp có thể liên kết tên đã kết hôn/thời con gái sẽ hữu ích.
Gần đây, tôi đã phải đổi tên hàng nghìn email để đổi lấy vì ai đó đã ly dị và không muốn bất kỳ email nào liệt kê cô ấy là [email protected]

1

Bạn thường không vượt quá chuẩn hóa biểu mẫu thứ tư trong Một cơ sở dữ liệu. Do đó việc chuẩn hóa hình thức thứ bảy là hơi quá đáng. Các chỉ nơi này thậm chí có thể là một ý tưởng hợp lý từ xa là trong một số loại kho dữ liệu lớn.

0

Không cần bình thường hóa cấp đó trừ khi tên tạo thành khóa chính kết hợp và bạn có dữ liệu phụ thuộc vào một trong các tên (ví dụ: bất kỳ ai có họ Plummer không biết gì về cơ sở dữ liệu). Trong trường hợp đó, bằng cách không bình thường hóa, bạn sẽ vi phạm second normal form.

0

Tôi đồng ý với phản hồi chung, bạn sẽ không làm điều đó.

Một điều cần lưu ý là, nén. Nếu bạn có một tỷ người và bạn thấy rằng 60% tên đầu tiên được lấy từ 5 tên rất phổ biến, bạn có thể sử dụng một số thao tác bit khéo léo để giảm kích thước rất đáng kể. Nó cũng sẽ yêu cầu phần mềm cơ sở dữ liệu rất tùy chỉnh.

Nhưng điều này không nhằm mục đích bình thường hóa, chỉ cần nén.

+1

Hoặc đơn giản là công cụ lưu trữ tùy chỉnh. – maxwellb

+0

>> Hoặc đơn giản một công cụ lưu trữ tùy chỉnh << là một phần của hầu hết các DBMS hiện đại lớn hơn hiện nay. – TheBlastOne

0

Bạn nên bình thường hóa nó nếu bạn cần phải tránh sự bất thường khi xóa mà không bị vi phạm. Đó là, nếu bạn cần phải trả lời câu hỏi, có cơ sở dữ liệu của tôi đã từng có một người tên là "Joejimbobjake" trong đó, bạn cần phải tránh sự bất thường. Xóa mềm có lẽ là một cách tốt hơn nhiều so với việc có một bảng tên đầu tiên toàn diện (ví dụ), nhưng bạn nhận được quan điểm của tôi.

0

Ngoài tất cả các điểm mà mọi người khác đã thực hiện, hãy xem xét rằng nếu bạn đang thực hiện thao tác nhập dữ liệu (ví dụ) và chèn liên hệ mới, bạn sẽ phải tìm kiếm họ và tên của bạn để xác định đúng Id và sau đó sử dụng các giá trị đó. Nhưng sau đó điều này là phức tạp hơn bởi nhân dịp khi tên không phải là trên các bảng FN và/hoặc LN, sau đó bạn phải chèn tên/họ mới và sử dụng id mới (s).

Và nếu bạn nghĩ rằng bạn có danh sách tên đầy đủ, hãy suy nghĩ lại. Tôi làm việc với một danh sách hơn 200k tên duy nhất và tôi đoán nó chiếm 99,9% dân số Hoa Kỳ. Nhưng điều đó .1% = rất nhiều người. Và đừng quên tên nước ngoài và lỗi chính tả ...

1

Nếu bạn có nhu cầu thực hiện truy vấn dựa trên tên nhỏ bé, tôi có thể thấy cần phải bình thường hóa tên. ví dụ. tìm kiếm "Betty" có thể cần trả lại kết quả cho "Betty", "Beth" và "Elizabeth"

Các vấn đề liên quan