2009-04-14 49 views
22

Khi xác định kiểu dữ liệu trong cơ sở dữ liệu, tôi luôn gặp sự cố khi chọn sử dụng số nguyên hoặc chuỗi để lưu trữ dữ liệu 'số' nhất định hay không.Số nguyên so với chuỗi trong cơ sở dữ liệu

Giả sử tôi đang xây dựng YetAnotherAddressBook và có trường mã bưu điện. Miễn là mã bưu điện là luôn luôn một số có 4 chữ số, tôi sẽ lưu trữ loại dữ liệu nào? Số nguyên hoặc chuỗi? Về mặt kỹ thuật nó là một số nguyên, nhưng tôi không làm bất kỳ loại tính toán nào trên nó, tôi chỉ nhổ nó ra thành một cái bàn. Ý kiến ​​của bạn sẽ thay đổi nếu tôi muốn sắp xếp bảng theo mã bưu điện?

Bây giờ, tôi không ngu ngốc. Tôi nhận ra nhu cầu hợp lệ cho các số nguyên, chẳng hạn như lượt xem trang và người dùng duy nhất hoặc người dùng đã đăng nhập và người dùng khách. Nhưng những gì về để lưu trữ có bao nhiêu tập tin trong một torrent? Số nguyên hoặc chuỗi?

+4

Và có. Tôi đã dành nhiều thời gian định dạng các liên kết hơn là viết câu hỏi thực tế –

Trả lời

36

Ở quốc gia của tôi, mã bưu điện cũng luôn có 4 chữ số. Nhưng chữ số đầu tiên có thể bằng không.

Nếu bạn lưu trữ "0700" như một số nguyên, bạn có thể nhận được rất nhiều vấn đề:

  • Nó có thể được đọc như một giá trị bát phân
  • Nếu nó được đọc một cách chính xác như một giá trị thập phân, nó được chuyển thành "700"
  • Khi bạn nhận được giá trị "700", bạn phải nhớ thêm số không
  • Tôi không thêm số không, sau này, làm cách nào bạn biết nếu "700" là " 0700 "hoặc ai đó đã nhập sai" 7100 "?

Về mặt kỹ thuật, mã bưu điện của chúng tôi thực sự là chuỗi, ngay cả khi mã luôn là 4 chữ số.

Bạn có thể lưu trữ chúng dưới dạng số nguyên, để tiết kiệm dung lượng. Nhưng hãy nhớ đây là một DB-trick đơn giản, và hãy cẩn thận về các số 0 hàng đầu.

Nhưng còn lưu trữ số lượng tệp trong torrent thì sao? Số nguyên hoặc chuỗi?

Đó rõ ràng là một số nguyên.

+0

Tôi nghĩ rằng nó phụ thuộc vào ứng dụng, liệt kê những lợi ích bạn sẽ nhận được nếu bạn sử dụng một trong khác. Tôi sử dụng số cửa hàng, chúng là số, nhưng thực sự chúng là một chuỗi bởi vì "00004" tôi muốn giữ nó theo cách đó mà không cần định dạng đầu ra khi tôi muốn nó có thể đọc được. Khi tôi lưu nó, tôi xác nhận nó là số, sau đó lưu nó thành chuỗi. Bất lợi của tôi rất có thể là kích thước lưu trữ, và vì tôi có một chỉ mục trên thực địa, nó có thể có hiệu suất hơi tồi tệ hơn nhưng tôi không phải là 100% về điều đó. – radtek

0

Mã bưu chính là chuỗi. Đối với một số comtries, những chuỗi có thể bao gồm onl của chữ số, nhưng điều đó không làm cho chúng số nguyên. Và sớm hay muộn hệ thống potal của bạn sẽ hết chữ số và quyết định bắt đầu sử dụng các chữ cái. Nếu cơ sở dữ liệu của bạn sử dụng số nguyên cho trường mã bưu điện, bạn sẽ ở trong doo-doo.

Điểm mấu chốt - nếu bạn không làm số học trên đó, nó có thể không thực sự là một con số.

2

Đối với mã bưu chính, tôi sẽ chọn một chuỗi. Nó không phải là một số nguyên. Nó chỉ là một định danh cho một cái gì đó và nó cũng có thể là một loạt bốn nhân vật.

Đối với số lượng tệp trong một torrent, phải là số nguyên.

2

Có phải '0000' là mã bưu điện không? Nó có khác biệt với '0' không?

Nếu số này luôn là số có 4 chữ số, tôi sẽ luôn lưu trữ dưới dạng 4 chữ số và điều đó sẽ chỉ để giữ nó dưới dạng chuỗi.

10

theo ý kiến ​​của tôi đối với mã bưu điện bạn phải sử dụng chuỗi, vì bạn có thể có mã bưu chính có số 0 (09100) và nếu bạn sử dụng số nguyên, nó sẽ là 9100: sắp xếp không phải là vấn đề, vì vẫn còn thứ tự chữ cái ('09100' xuất hiện trước '09101'). Để lưu trữ số tệp tôi mong đợi một trình chuyển đổi, do đó bạn không gặp phải bất kỳ sự cố nào khi tăng/giảm số lượng tệp. Vì vậy, số nguyên vs chuỗi phụ thuộc vào việc sử dụng bạn thực hiện!

9

Đây là câu hỏi về ngữ nghĩa. Bạn đang cố gắng quyết định kiểu dữ liệu thích hợp để lưu trữ có thể là một câu hỏi phức tạp. Nguyên tắc tốt nhất là lưu trữ dữ liệu của bạn dưới dạng số nguyên nếu bạn cần sử dụng dữ liệu làm số nguyên.

Nói cách khác, vì bạn sẽ không bao giờ sử dụng mã bưu chính dưới dạng số nên không có ý nghĩa để lưu trữ dưới dạng một. Việc dữ liệu trông như thế nào giống như, điều quan trọng là số . Mã bưu điện có phải là số không? Không, đó là một chuỗi các ký tự chỉ xảy ra được tạo thành từ các ký tự hoàn toàn bằng số. Do đó, mã bưu điện được lưu trữ tốt nhất dưới dạng chuỗi.

1

Tôi không sử dụng loại dữ liệu số trừ khi tôi dự kiến ​​thực hiện toán học trên dữ liệu. Tại sao rủi ro tìm một vấn đề trong tương lai cho một cái gì đó mà bạn "chắc chắn" sẽ luôn là một con số mà ai đó quyết định đặt một ký tự không phải là số.

Nếu bạn không làm toán trên nó làm cho nó một chuỗi.

0

Yếu tố quyết định quan trọng, cho dù applcation có cần tính toán số học trên các giá trị không, nếu không thì lý do duy nhất để sử dụng số nguyên là giảm yêu cầu lưu trữ. hiệu suất trong một ứng dụng quan trọng - bằng cách giảm chiều rộng của chỉ mục bảng để tăng hiệu suất chỉ mục, ví dụ), nhưng nói chung, không quan trọng ...

Nếu không cần phải làm số học với các giá trị, thì một chuỗi là tốt nhất.

5

Mã bưu điện không phải là số: đó là mã hoặc số nhận dạng. Điều tương tự cũng áp dụng cho số điện thoại.

Số tệp trong torrent là số nguyên.

Ít nhất, trong trường hợp này bạn có thể tạo CHECK CONSTRAINT LIKE '[09][09][09][09]' để giữ dữ liệu chính xác ở cấp cơ sở dữ liệu.

1

Bạn cũng nên nhớ rằng không phải tất cả các mã bưu chính trong tất cả các quốc gia đều chỉ là số. Chỉ vì bạn không có bất kỳ addreses tại Canada ngay bây giờ không có nghĩa là bạn sẽ không có bất kỳ. Tôi đã luôn luôn đi theo quy tắc, nếu bạn muốn làm tính toán toán học lưu trữ nó trong một loại số, nếu nó chỉ là một mã (bưu chính, điện thoại, SSN, partnumber, vv) sau đó tôi lưu trữ nó như là một chuỗi. Những gì bạn muốn tránh là bất kỳ việc truyền dữ liệu không cần thiết nào sang định dạng khác mỗi khi bạn gọi nó lên (ví dụ mã để thêm số 0 đứng đầu nếu bạn lưu trữ mã bưu điện dưới dạng số hoặc mã để chuyển đổi chuỗi thành số để tính toán). Đây có thể là các hoạt động tốn kém nếu bạn cần thực hiện chúng nhiều lần, đặc biệt khi các bảng lớn và bạn phải thực hiện chuyển đổi trong mệnh đề where. Nó là tốt hơn để lưu trữ dữ liệu theo cách bạn cần phải sử dụng nó.

28

tôi luôn luôn sử dụng các nguyên tắc sau:

Nếu bạn có kế hoạch thực hiện các tính toán toán học trên nó (thêm/trừ/etc) làm cho nó một số nguyên hoặc kiểu dữ liệu số khác.

Nếu bạn không có kế hoạch thực hiện bất kỳ loại phép tính toán học nào trên trường, hãy lưu trữ dưới dạng chuỗi.

Trong trường hợp mã Zip, bạn không bao giờ nên có thời gian bạn cần thêm vào mã zip hoặc trừ hoặc nhân hai mã zip với nhau. Các hàm toán học nói chung không được sử dụng trên mã ZIP vì chúng được sử dụng làm định danh và không phải là số lượng. Vì vậy, bạn nên lưu trữ zip code của bạn như là một kiểu dữ liệu chuỗi

+1

Tôi hoàn toàn đồng ý và sử dụng lý do đó. +1 – Cerebrus

6

Vâng như xa như postcodes đi, đây là một Vương quốc Anh mã bưu điện điển hình:

EC2R 6PK 

Trong trường cơ sở dữ liệu giảng viên của tôi nói với tôi cái gì đó đã bị mắc kẹt với tôi và vẫn còn hơn 15 năm sau:

Nếu bạn thực hiện số học trên đó, hãy lưu dưới dạng số. Nếu không, đó là chuỗi .

Thành thật mà nói, tôi không nghĩ rằng bạn có thể đi sai với lời khuyên đó.

Rõ ràng là bạn không thực hiện số học trên mã bưu điện, do đó chúng là chuỗi.

+0

Nếu bạn lập chỉ mục trường nói trong cơ sở dữ liệu quan hệ như postgres/mysql hoặc thậm chí mongodb nosql db, sẽ có bất kỳ tác động hiệu suất nào khi sử dụng char over index? Đó là điều tôi hoài nghi. – radtek

0

Thời gian chờ "luôn luôn" có nghĩa là "cho tháng tiếp theo". Tôi sẽ không đếm trên 4 chữ số mã không đi chữ số trong vòng đời của trách nhiệm của tôi.

Một số phương ngữ của SQL hỗ trợ một dataype giống như NUMBER (4). Điều này hoạt động giống như một chuỗi ký tự, nhưng bảng chữ cái là từ 0 đến 9.

0

Tôi thấy không có vấn đề gì với việc lưu trữ mã zip dưới dạng số ngay cả khi bạn không muốn thực hiện các phép toán trên đó.

Trong kho dữ liệu công ty của chúng tôi, chúng tôi là người nhận dữ liệu từ nhiều hệ thống cũ. Kết quả là, chúng ta thấy rất nhiều dữ liệu rác đang được sử dụng.

Đưa trường hợp của chúng tôi vào nơi chúng tôi có số nhận dạng địa lý là giá trị "số" có 4 chữ số không được điền đầy đủ. Trường này thường được sử dụng để nối các bảng với nhau.

Tôi sẽ thực hiện một trong hai cách tiếp cận: 1) khai báo cột là trường char có chiều dài 4 và thêm CONSTRAINT LIKE '[09] [09] [09] [09]' 2) xác định độ dài số 4 và nếu người dùng muốn, hãy định dạng giá trị WHEN DISPLAYING.

Phương pháp tiếp cận số 1 giúp bạn giải quyết nhiều rắc rối khi định dạng liên tục, nhưng nếu bạn thường lọc và thậm chí lập chỉ mục/tham gia vào cột, tôi sẽ xem xét rằng chúng tôi đã tắt tùy chọn # 2 .

Lý do thứ ba là kinh nghiệm của tôi là mọi người chỉ đơn giản là lười biếng khi nói đến việc thêm ràng buộc vào cơ sở dữ liệu hoặc họ không biết gì. Tôi nghĩ rằng nó là lười biếng hơn, cá nhân. Tôi thấy các ràng buộc tồn tại chủ yếu được áp dụng như các chỉnh sửa trong ứng dụng mà ban đầu thu thập dữ liệu và những sửa đổi đó không được áp dụng thống nhất.

Kết quả là kho dữ liệu của chúng tôi kết thúc nhận tất cả các loại biến thể, bao gồm cả việc không điền trước bằng số không hoặc biện minh cho giá trị.

Khi bạn xác định thứ gì đó là INTEGER, bạn sẽ tự động nhận được bộ nhớ hiệu quả hơn, đặc biệt. khi lập chỉ mục trên cột và chỉnh sửa mọi người hiểu và có nhiều khả năng được áp dụng nhất quán trên các hệ thống cũ bởi các nhà thiết kế cơ sở dữ liệu có khả năng khác nhau.

Tôi không có vấn đề gì với tùy chọn # 1, ngoại trừ việc sử dụng trường trong chỉ mục và mối quan tâm của tôi về cách tiếp cận khi bạn chấp nhận trường là số apha, mọi người có xu hướng ném thêm rác vào đó.

Lấy ví dụ, số nhận dạng nhân viên Peoplesoft của chúng tôi. Ai đó đã quyết định thêm dấu "X" trước một nhân viên có 6 chữ số không được điền vào để chỉ định rằng nhân viên là một nhà thầu. Điều này vi phạm một thực hành cá nhân của tôi không kết hợp các mẩu thông tin riêng biệt vào một lĩnh vực duy nhất. Điều này gây ra tất cả các loại vấn đề mâu thuẫn trên các hệ thống khác nhau. Nếu trường này là một số, không ai có thể cố gắng làm điều đó.

Nhận xét?

0

Điều quan trọng là phải hiểu ngữ nghĩa của dữ liệu bạn đang làm việc. Hãy để tôi giải thích nó trên ví dụ.

Cân nhắc bạn muốn lưu trữ mã PIN trong cơ sở dữ liệu của mình. Để trả lời những gì datatype bạn nên sử dụng bạn phải firt trả lời những gì PIN (Personal identification number) thực sự có nghĩa là.

  1. Nếu nó thực sự là số như tên gọi thực sự cho biết thì tôi không thấy bất kỳ lý do gì không được biểu diễn dưới dạng số nguyên.

    Một số người có thể lập luận rằng bạn không thể phân biệt giữa 0001 và 01. Rõ ràng họ không xem xét số PIN và nếu họ đang làm việc phù thủy ngữ nghĩa như vậy họ nên sử dụng chuỗi.

    Lưu ý: Nếu số PIN được cố định, giả sử 4 chữ số vẫn có thể sử dụng số nguyên vì bất kỳ số nào sẽ luôn được điền bằng số 0 đứng đầu và sẽ chính xác giống nhau (0001 sẽ bằng 01) - nhưng giới hạn độ dài cố định này là điển hình cho các số để tránh đầu vào không chính xác.

  2. Nếu ngữ nghĩa nói rõ mã PIN là số, nghĩa là mã PIN 0001 giống hệt mã PIN 01, tôi sẽ sử dụng một biểu diễn số nguyên.

Vì vậy trong trường hợp của bạn, điều quan trọng là phải hiểu postal code ngữ nghĩa. Đó là ngữ nghĩa có thể khác nhau ở các quốc gia khác nhau (hoặc thậm chí thay đổi theo thời gian) vì vậy nó cũng quan trọng mà bạn muốn sử dụng. Để bao gồm tất cả các loại mã bưu điện và thậm chí có thể thay đổi, tôi sẽ xem xét sử dụng nhiều loại dữ liệu trừu tượng hơn hoặc chỉ một chuỗi (Tôi tin rằng đã có ngữ nghĩa có chứa nhiều ký tự hơn chỉ là chữ số).

Tôi sẽ không khuyên bạn nên để thực hiện theo các quy tắc đơn giản như quy tắc về hoạt động số học trên biểu diễn dữ liệu. Nếu bạn không muốn thực hiện các phép toán với dữ liệu bây giờ không có nghĩa là bạn sẽ không muốn đôi khi trong tương lai.

Bạn có dữ liệu và bạn muốn lưu trữ nó, đại diện cho nó bằng cách nào đó - chỉ cần nghĩ về những gì bạn đang làm việc.

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