Write a Python function `second_smallest(numbers)` that takes a list of numbers as input and returns the second smallest unique number in the list. If the list does not contain at least two unique numbers, the function should return `None`.
#### Example Usage
```python [main.nopy]
print(second_smallest([1, 2, -8, -2, 0, -2])) # Output: -2
print(second_smallest([1, 1, -0.5, 0, 2, -2, -2])) # Output: -0.5
print(second_smallest([2, 2])) # Output: None
print(second_smallest([2, 2, 2])) # Output: None
```
#### Constraints
- The input list can contain integers and floating-point numbers.
- The input list can have duplicate values.
- The function should handle edge cases, such as an empty list or a list with only one unique number.